perm filename DIRED.OLD[CSP,SYS]1 blob
sn#363371 filedate 1978-06-25 generic text, type C, neo UTF8
COMMENT ⊗ VALID 00043 PAGES
C REC PAGE DESCRIPTION
C00001 00001
C00004 00002 TITLE PAGE
C00005 00003 Random Blocks and Defs
C00022 00004 DMSWAP DMGO GO NODM GO2 RCYCLE RCYCL1
C00025 00005 Main loop. Display, Decode, Execute
C00031 00006 Switch Decoder
C00035 00007 Cursor up and down
C00049 00008 Window up and down
C00054 00009 Enter E on current file
C00058 00010 Delete HAS BEEN DELETED
C00064 00011 New Delete System
C00073 00012 Put up new arrow
C00075 00013 Exit to DDT or World
C00076 00014 Run Delete list, and clear
C00081 00015 Gobble argument
C00082 00016 Put up a display
C00093 00017 Initialization
C00095 00018 Read UFD and produce FILES table
C00108 00019 Line Editing
C00114 00020 Produce english for line editor
C00115 00021 Produce english of of file pointed to by A in DIRLIN
C00123 00022 Sort the files
C00127 00023 Switch Code
C00136 00024 Print a bit of this file
C00137 00025 Read PPN
C00140 00026 Read a Mask
C00147 00027 Output Text to Random Device
C00152 00028 Files Spooled Here. No cost, no obligation
C00156 00029 FNR for /OUTPUT command
C00160 00030 Trivia
C00165 00031 Temp core
C00170 00032 To err is human, to forgive, Divine
C00173 00033 Help a luser
C00183 00034 UUO Handler
C00185 00035 GET uuo
C00188 00036 SGEN uuo
C00189 00037 SPRINT uuo
C00190 00038 FLOOKUP uuo
C00193 00039 REMOVE uuo
C00196 00040 TYPE6 uuo
C00197 00041 TTY6 uuo
C00198 00042 Usage lossage
C00203 00043 END GO
C00204 ENDMK
C⊗;
;TITLE PAGE
TITLE DIRED
;(C) 1974 by Stanley G. Kugell. All rights reserved.
;The name Dired, the program and design are the property of the author.
;DOCUMENT IN DIRED.SGK[UP,DOC]
;Warning to would be hackers: this program is a crock of shit. The idea
;ain't so bad, but this program was only intended to test the utility
;of the idea. Unf, I never wrote the real thing.
COMMENT ⊗ Random Blocks and Defs ⊗
A←1
B←2
C←3
D←4
E←5
P←6 ;PUSH DOWN LIST 1
I←7
II←10
F←11
L←12 ;L K J ARE USED BY RUBIN'S FNR KLUDGE ONLY
K←13
J←14
Q←17 ;PUSH DOWN LIST 2
NEWUFD←←1 ;ASSEMBLE FOR LONG UFD ENTRIES
DEFINE CONC!(CONCA,CONCB)<CONCA!CONCB>
DEFINE INSIRP (INST,ADDS) <
FOR ZZZ IN (B) <
A,ZZZ
>
>
DEFINE SWGARDEN (HERETH) ;ERE, EVERYWHERE. SURROUNDED BY SWITCHES!
;DO THE STANDARD ESCAPE TRICK AFTER DEALING WITH A SWITCH
<
TRNN F,%START ;DIRECT IF TAKING SWITCHES FROM COMMAND LINE
JRST RIHANG ;GET SOME MORE
TRNN F,%RRUFD ;IF WE HAVE REC. A FILE NAME MUST RCYCLE
JRST HERETH ;CONTINUE HACKING IN WAY SPECIFIED BY CALLER
JRST RCYCLE ;ONE OF THE FNR'S DID A JRST SWITCH, WE MUST DO LONGLOOP PASS
>
DEFINE GETFIL $ (LE,STR,LH,CH,BUF,BYTE,HAKRET)
<ZZ←←.
IFDIF <STR><><OUTSTR [ASCIZ /$STR$/]>
PUSHJ P,FILSCN ;INPUT FILE SPECS
IFIDN <LE> <L> <LH,,LUP>
IFIDN <LE> <E> <LH,,ENT>
JRST [ CRLF ;ALT TYPED
JRST HAKRET]
JRST [ OUTSTR [ASCIZ /Ho Ho! ;GARBAGE TYPED
/]
CLRBFI
JRST ZZ]
INIT CH,10
'DSK '
IFIDN <LE> <E> <BUF,,> IFIDN <LE> <L> <BUF>
JRST INITL
IFIDN <LE> <L> <LOOKUP CH,LUP
JRST [ PUSHJ P,LUPFL
JRST ZZ]>
IFIDN <LE> <E> <ENTER CH,ENT
JRST [ PUSHJ P,ENTFL
JRST ZZ]>
MOVEI A,BYTE
DPB A,[300600,,BUF+1]
>
DEFINE CRLF
< OUTCHR [15]
OUTCHR [12]
>
DEFINE FIXGAP (AC0,TABLE,LENGTH,GAPSIZ)
;CLOSE GAP IN TABLE, STARTING AT
;TABLE (AC0), OF LENGTH 'GAPSIZ'. LENGTH← TABLE LENGTH
<
ADDI AC0,TABLE ;TURN THE IDX AC INTO POINTER
HRLI AC0,GAPSIZ(AC0) ;TURN PTR. INTO <END OF GAP + 1>,,<BEGINING OF GAP>
BLT AC0,TABLE+LENGTH-1 ;BLT <END OF GAP + 1> (FIRST REAL GOODIES) UP
> ;FIXGAP
DEFINE CW(C1,B1,C2,B2,C3,B3) <
<BYTE (8)<B1>,<B2>,<B3> (3)<C1>,<C2>,<C3>>!4
>
DEFINE ISTHIS (AC,GOTO,CHAR,CONDCL,CONDMT,CONDCM) <
IFE "CONDCL"-"T",< ;IF CONTROL !CHR! IS ONE OF THE THINGS HE LOOKING FOR
CAIE AC,200+"CHAR" ;α CHAR?
CAIN AC,200+"CHAR"+40 ;OR α char?
JRST GOTO ;THEN GO WHERE WE WERE TOLD TO
> ;CONDCL
IFE "CONDMT"-"T",< ;IF META !CHR! IS ONE OF THE CHRS HE WANTS TO JRST ON
CAIE AC,400+"CHAR" ;β CHAR?
CAIN AC,400+"CHAR"+40 ;OR COULD IT BE β char
JRST GOTO ;DO IT
> ;CONDMT (CONDITION META)
IFE "CONDCM"-"T",< ;IF CONTROL META !CHAR! IS SUPPOSED TO BE RECOGNIZED
CAIE AC,600+"CHAR"
CAIN AC,600+"CHAR"+40
JRST GOTO
> ;CONDCM (CONDITION CONTROL META)
> ;DEFINE ISTHIS
DEFINE ERR (CODE,MSG,INS,MSG1) <
JRST [
IFE CODE,<PUSHJ P,CLEAR> ;ONLY CLR WHEN CODE IS 0
OUTSTR [ASCIZ ≡MSG≡]
INS ;EXECUTE THIS GUYS INSTRUCTION IF HE GAVE ONE
OUTSTR [ASCIZ ≡MSG1≡]
MOVEI .
CLRBFI
EXIT]
> ;DEFINE ERR
DEFINE PUT (TOO,FROM) <
PUSH P,
MOVE FROM
MOVEM TOO
POP P,
>
DEFINE ARGET (B0,B1,B2) <;PUT POS. ARG IN B0, IF NONE DEFAULT TO A1, IF NEG. GIVE TO A2
SKIPE ARGSGN↔JRST [SETZM ARGSGN↔JRST B2]↔SKIPE ARGF↔SKIPA B0,ARG↔MOVEI B0,B1
>
DEFINE ... < JRST 4,. >
;DD COMMAND DEFS
EXCT←←0↔FNCN←←1↔CHNL←←2↔COLM←←3↔HILIN←←4↔LOLIN←←5↔ALPHA←←46
;RIGHT HALF FLAGS
%START←←1 ; 0==> READING MONITOR COMMAND LINE, IN GENERAL, RETURN TO RIHANG
; IN THIS MODE, 1==> LINE READ, UFD READ (OR BEING READ)
%SORT←←2 ; 0==> SORT BY ALPHA, 1==> SORT BY DATE
%GETTY←←4 ; 0==> DD, 1==> III DISPLAY
%DEBUG←←10 ; 0==> NOTHING, 1==> DEBUG MODE FOR WHAT ITS WORTH
%UDP←←20 ; 0 ==> EDIT FROM DSK, 1==> USE UDP
%ORDER←←40 ; 1==> REVERSE SORT
%DISPLAY←←100 ; 1==> DISPLAYING DELETE LIST, NOT FILES
%NOOK←←200 ; 1==> INHIBIT TYPING "OK". COMMANDS SET, OCYCLE RESETS
%TCORE←←400 ; 1==> TMPCOR FILE WAS FOUND AND READ. RESET AT RCYCLE
%DEVUO←←1000 ; 1==> 'BP7' UUOS OUTPUT TO FIL CHAN, NOT BP7
%KMODE←←2000 ; 1==> PRINT FILE SIZES LARGER THAN 1000 IN K'S
%XTSRT←←4000 ; IF %SORT IS 0
; 0==> SORT BY FULL FILE NAME
; 1==> SORT WITH FILE NAME AND EXT SWITCHED IN SIGNIFICANCE
; IF %SORT OR %SZSRT = 1, BIT IS UNUSED
%DDELS←←10000 ; 1==> DISPLAY DELETE LIST, NOT FILES
%RRUFD←←20000 ; 1==> MUST RE READ UFD, GETS RESET AT RCYCLE WHILE DELETEIN
%FAST←←40000 ; 1==> INHIBIT LOOKUPS, DONT DELETE FILES, ETC. FAST MODE
%SZSRT←100000 ; 1==> SORT BY SIZE. PRECEDENCE OVR %SORT AND %XTSRT
%TTY←←200000 ; 1==> NO DPY. JUST LIST SORTED FILES.
%READO←←400000 ; 1==> READONLY MODE. DONT DO ANY DELETES
;BLOCK SIZES
PDS←←=69
QPDS←←20 ;Q PDL SIZE
FIL←←2 ;DELETES ON THIS CHAN. RANDOM IO HERE
FILC←←1 ;CHAN. FOR LONG LOOKUP
UFDC←←0 ;UFD CHAN
MFDC←←3 ;READ [1,1] HERE WHEN THERE IS A PPN WITH ∀'S
NFILES←←=750 ;NUMBER OF FILES PROGRAM SHOULD BE ABLE TO TAKE CARE OF
NLINES←←35 ;NUMBER OF DISPLAY LINES
DIRLEN←←=30*NLINES;LENGTH OF OUTPUT AREA FOR GENTXT
GLTP←←0 ;GLITCH SCREEN IF THIS CLOSE TO EDGE OF WINDOW
GLTBY←←3 ;WHEN GLITCHING, DO SO BY THIS AMOUNT
IIITOP←←600 ;Y POS OF FIRST DIRECTORY LINE
; ...←←0 ;UNFINISHED CODE
BP7: -1 ;BYTE POINTER FOR GENTXT
PATCH: PAT: BLOCK 100
IIHEAD: 0
IIMUNG: BYTE (11)<-1020>,IIITOP (3)2,2 (1)0,1 (2)2 (4)6
ASCID /→/
BYTE (11)<-1000>,710 (3)2,2 (1)0,1 (2)2 (4)6
DIRLIN,,20
DDHEAD: CW FNCN,ALPHA,FNCN,ALPHA,FNCN,ALPHA
DDMUNG: CW COLM,2,HILIN,1,LOLIN,11 ;13?
DIRLIN: BLOCK DIRLEN ;BUFFER FOR GEN. OF ENGLISH OF DIRECTORY
ZERO: BLOCK =60 ;FOR END OF DD PROGRAM. IF THIS IS NON-ZERO YOU ARE LOSING
CW EXCT,0,CHNL,0,CHNL,0
XALL
LUKDAT: REPEAT NFILES*7+1,{
-1};UFDREAD STUFFS LOOKUP DATA IN HERE FOR INDIV FILES
LALL
DDARRO: CW FNCN,66,COLM,1,CHNL,0
DDAMUN: CW CHNL,0,HILIN,0,LOLIN,0
ASCID /→/
CW EXCT,0,CHNL,0,CHNL,0
0
DDFLSA: CW FNCN,66,COLM,1,CHNL,0
DDFMUN: 0 ;GETS SET UP
ASCID / /
CW EXCT,0,CHNL,0,CHNL,0
0
MMASK: -1 ;MASTER MASK FOR READ UFD LEVEL. -1 IMPLIES ANY CHARACTER
-1 ; PARTICULAR CHR (STORED IN SIXBIT) IS THAT CHR.
-1
-1
-1
-1
MMASK2: -1 ;THIS IS THE EXT. FOR MASTER MASK.
-1
-1
WORDS: -1 ;MAINTAINS COUNT OF TOTAL NUMBER OF WORDS IN USER'S DIRECT
CURFIL: -1 ;CURRENT FILE USER THINKING ABOUT (IDX INTO FILES)
DIPFIL: -1 ;FIRST FILE DISPLAYED FROM TOP (INDX INTO FILES)
CURFIS: -1 ;CURFIL GETS HIDDEN HERE WHILE WE IN DELETE LIST MODE
DIPFIS: -1 ;DIPFIL GETS STUFFED HERE WHEN ENTERING DELETE LIST MODE
TFILE: -1 ;NUMBER OF FILES (TFILE-1 IS HIGHEST INDEX INTO FILES USED)
TFILE1: -1 ;LARGEST INDEX INTO FILES (TFILE-1), LARGEST CURFIL SHLD B.
TFILES: -1 ;TFILE IS HIDDEN HERE WHEN IN DELETE LIST MODE
RLUKOK: 0 ;REASNG SETS IFF UFD LOOKUP OKAY
DDSELP: 0 ;WHEN -1 CLEAR DOES NOT GO BACK TO PAGE 0
ANYWHO: 0 ;0==>FAST MODE, FREE AND CLEAR. 1==> AT LEAST 1 FILE HAS BEEN LOOKED UP
FLKDAT: 0 ;FLOOKUP UUO LEAVES POINTER TO DATA HERE
UFDIN: BLOCK 6 ;WHERE LONG LOOKUPS LEAVE DATA
SPLBLK: BLOCK 4 ;HERE THE SPOOL INSERT LOSS USES AS LOOKUP BLOCK
LUSER: -1 ;PPN OF LUSER LUSING
RENBLK: BLOCK 6 ;RENAME TO DELETE HAPPENS HERE (USED FOR BTH LONG AND SHORT REN'S)
DELBLK: '......' ;LOOKUPS FOR DELETING HAPPEN HERE, THEREFORE HAS NAME OF FIL
BLOCK 3 ; LAST DELETED IN IN. SIMULATE '......' FOR IT.
FILNUL: BLOCK 3 ;DUMMY BUFFER HEADER FOR LONG LOOKUP'S INIT
MFDNUL: BLOCK 3 ;HEADER FOR MFD CHAN
UFDNUL: BLOCK 3 ;HEADER FOR UFD CHAN
UFDB: BLOCK 4 ;LOOKUP BLOCK ON UFD FILE
DATES: BLOCK NFILES ;HAVE FILE DATES IN UFD ORDER PUT IN HERE
;these are ufd tables
UFD: BLOCK NFILES ;STORE FIRST WORD OF EACH UFD ENTRY HERE
UFD2: BLOCK NFILES ;STORE SECOND WORD OF UFD ENTRIES
LLUSER: BLOCK NFILES ;STORE PPN PARR. WITH UFD AND UFD2 HERE
FULWHO: BLOCK NFILES ;NON 0 ==> THIS GUY IS IN FAST MODE. 0==> display full info
WRITER: BLOCK NFILES ;PROGRAM WHO LAST WROTE FILE
WRITES: BLOCK NFILES ;USER WHO LAST WROTE FILE
FILES: BLOCK NFILES ;BLOCK OF PARTIAL FILE NAMES,,UFD ENTRY NUMBER
-1 ;FOR END
EDITRR: 0 ; ≠ 0 ==> EDIT IN /R MODE. SET BY EDITR, RESET IN EDITF
DELIS0: BLOCK NFILES ;DELETE LIST, FILES TO BE FLUSHED WHEN EXITING.
-1 ;FIRST FILE NAME KEPT HERE, IN PAR. WITH ...
DELIS1: BLOCK NFILES ; THIS, FILE EXTENSION,,UFD IDX NUMBER KEPT HERE.
-1 ;NOTE UFD INDXS ARE INTO CORE TABS, NOT DSK UFD
DELIS2: BLOCK NFILES ;PPN TABLE FOR DELETE LIST
-1
PDL: BLOCK PDS
QPDL: BLOCK QPDS ;Q PDL
UUOACS: BLOCK 20
;UUO'S
OPDEF GET [1000,,] ;GET WORD FROM UFD CHAN
OPDEF SGEN [2000,,] ;STUFF STRING ONTO BP7
OPDEF SPRINT [3000,,] ;OUTPUT CONT. OF E TO BP7 IN RADIX AC
OPDEF FLOOKU [4000,,] ;LOOKUP ON FILC, BUT USE LUKDAT IF YOU CAN
OPDEF REMOVE [5000,,] ;REMOVE THIS FILE FROM CORE DATA
OPDEF TYPE6 [6000,,] ;IDPB AC CHRS OF SIXBIT FROM E TO ASCII BP7
OPDEF TTY6 [7000,,] ; "" "" TO THE TTY
OPDEF SGENA [10000,,] ;SGEN THAT SKIPS
;RANDOM OPDEFS
OPDEF SAVE [PUSH P,]
OPDEF RETURN [POP P,]
OPDEF RECALL [POP P,]
COMTAB: ;SWITCHES IN ALPHA ORDER CORR. TO DOTAB
[ASCIZ /ABORT/]
[ASCIZ /ALPHA SORT/]
[ASCIZ /DEBUG MODE/]
[ASCIZ /DELETE/]
[ASCIZ /DATE SORT/]
[ASCIZ /DSK MODE/]
[ASCIZ /EDIT FILE/]
[ASCIZ /EXAMINE FILE/]
[ASCIZ /EXTENSION SORT/]
[ASCIZ /F/]
[ASCIZ /FAST MODE/]
[ASCIZ /FOONLY/]
[ASCIZ /FULL MODE/]
[ASCIZ /HELP I NEED SOMEBODY, HELP NOT JUST ANYBODY/]
[ASCIZ /K MODE/]
[ASCIZ /LOOKUP CURRENT FILE/]
[ASCIZ /OUTPUT/]
[ASCIZ /PRINT A BIT OF THIS FILE/]
[ASCIZ /R/]
[ASCIZ /READONLY/]
[ASCIZ /READWRITE/]
[ASCIZ /REVERSE SORT/]
[ASCIZ /SHOW DELETE LIST/]
[ASCIZ /SIZE SORT/]
[ASCIZ /SPOOL MY FILES, PLEASE/]
[ASCIZ /UDP MODE/]
COMEND:
COMLEN←←COMEND-COMTAB+1
DOTAB: ABORT ;ABORT DELETES TYPED SO FAR, BUT NOT RUN
ALPHAS ;SORT BY FILE NAMES
DEBGM ;DEGUG MODE
RUNDEL ;RUN DELETE LIST, ACTUALLY DO DSK DELETES
DATESR ;SORT BY FILE WRITE DATES
DSKMOD ;EDIT DSK
EDITF ;EDIT THE CURRENT FILE
EDITR ;EXAMINE, EDIT THE CURRENT FILE IN /R MODE
EXTSRT ;SORT IN ALPHA, FILE NAME AND EXT SWITCHED
FFASTM ;FAST MODE, DONT DO LOOKUPS
FFASTM ;ANOTHER WAY OF TYPING IT
OUTDTA ;OUTPUT FILE DATA (AS IN OUTPUT) IN FOONLY MODE
FFULM ;GET OUT OF FAST MODE, READ LOOKUPS
HELPSW ;DISPLAY SWITCH HELP
KMODC ;COMPLEMENT %KMODE
LKPCF ;GET ALL THE DATA ON THIS RANDOM FILE, AND DISPLAY IT IN THAT WAY
OUTDT ;OUTPUT ALL THE DIRECTORY INFORMATION TO GIVEN DEVICE
PRIFIL ;PRINT A COUPLE OF LINES OF THIS FILE, NOT INCLUDING E DIRECTORY PG
RDONLY ;ENTER READ ONLY MODE
RDONLY ; " "
READW ;ENTER READWRITE MODE
RVSRT ;COMPLEMENT THE ORDER OF THE FILES (A TO Z, OR Z TO A) ..
SHOWU ;COMPLEMENT SHOW DELETE LIST/FILE DIRECTORY
SZSRTS ;SORT FILES BY SIZE
SPOOLR ;SPOOL ARG FILES FROM CURRENT
UDPMOD ;EDIT UDP RATHER THAN DSK
MONTHS: SGEN [ASCIZ /-Jan-/]
SGEN [ASCIZ /-Feb-/]
SGEN [ASCIZ /-Mar-/]
SGEN [ASCIZ /-Apr-/]
SGEN [ASCIZ /-May-/]
SGEN [ASCIZ /-Jun-/]
SGEN [ASCIZ /-Jul-/]
SGEN [ASCIZ /-Aug-/]
SGEN [ASCIZ /-Sep-/]
SGEN [ASCIZ /-Oct-/]
SGEN [ASCIZ /-Nov-/]
SGEN [ASCIZ /-Dec-/]
;DMSWAP DMGO GO NODM GO2 RCYCLE RCYCL1
DMSWAP: SIXBIT/SYS DMDRD DMP /
0
0
DMGO: MOVEI B,0
SKIPE FROME
MOVEI B,1 ;Start up DMDRD in RPG mode if we were
MOVEM B,DMSWAP+3
MOVEI B,DMSWAP
SWAP B,
JRST NODM
GO: JRST .+3 ;E STARTS AT +1
CLRBFI ;FLUSH TRASH FROM E'S INPUT BUFFER
SETOM FROME# ;AVOID THINKING ABOUT COMAND LINE
MOVE P,[-PDS,,PDL-1]
MOVEI F, ;ZERO ALL THE FLAGS
SETO A, ;GETLIN LIKES -1
GETLIN A ;TELL LUSER HE IS LUSING IFF NOT DISPLAY
TLNE A,40000 ;DM'S USE ANOTHER PROGRAM
JRST DMGO
TLNN A,20000!400000 ;SKIP IF DD OR III
NODM: TRO F,%TTY ;NOT DISPLAY
TLNE A,(<SETZ>) ;direct IF III, skip IF DD
TRO F,%GETTY ;ONE MEANS III
MOVEI A,
DSKPPN A,
MOVEM A,LUSER ;DEFAULT TO SELF
MOVE A,[JSR UUOH]
MOVEM A,41
PUSHJ P,RTMPC ;READ THE TEMP CORE FILE
SKIPE FROME ;DONT THINK ABOUT COMMAND LINE IF WE ARE HERE FROM E
JRST RCYCLE
PUSHJ P,RSCAN ;FIGURE OUT WHO CALLED US AND SCAN TILL END OF
JRST SETMASK ;THIS GUY WILL LISTEN TO TTY
TRZ F,%START ;WE SHOULD BE OUT OF TOWN BY SUNDOWN
SETZM FROME ;STUFF MONTIOR READ
COMMENT ⊗ Old Rescan
RESCAN ;GET THE COMMAND LINE BACK
GO2: INCHRS A
JRST RCYCLE ;THAT'S IT, NO SWITCHES
CAIE A,";"
JRST GO2 ;WELL, TRY THE NEXT CHR
TRZ F,%START ;THIS MEANS WE ARE ONLY PARTIALLY RUNNING, BE CAREFUL
JRST SETMASK; THIS WILL TRY TO GET A FILE NAME FOR MASK, AND
;PASS THE BUCK TO RPPN OR SWITCH IF IT NEEDS TO.
⊗
RCYCLE: TRZN F,%RRUFD ;WE GOT HERE FROM RPPN ETC. SO RUN DELETE LIST FIRST
JRST RCYCL1
PUSHJ P,USTATS ;USE STATISTICS HACK
SKIPE DELIS0
OUTSTR [ASCIZ /Running delete list - /]
PUSHJ P,XITING
RCYCL1: TRNN F,%TCORE ;SKIP OVER THESE RESETS IF WE GOT THEM SET UP FRM TMPCOR FILE
SETZM CURFIL ;SET CURRENT FILE CELL TO FIRST FILE
TRZN F,%TCORE
SETZM DIPFIL ;SET FIRST FILE TO BE DISPLAYED TO FIRST FILE
;FALL THRU TO NEXT PAGE
COMMENT ⊗ Main loop. Display, Decode, Execute ⊗
;FALLS THRU
PUSHJ P,GETSET ;INITS AND SET UP DD PLEASE
TRNN F,%START ;PRINT THIS MESSAGE IF THIS IS THE FIRST TIME THRU
outstr [asciz ∧
DIRED.6 Type ? for Help [Last writer displayed]∧]
TRO F,%START ;WE ARE FULLY STARTED, DIRECT IF FIRST TIME THRU
CYCLE: PUSHJ P,ZCLEAR
PUSHJ P,REAUFD ;READ THE UFD, RETURN IN A # OF FILES IN DIR
HRRZM A,TFILE↔SUBI A,1↔HRRZM A,TFILE1
SCYCLE: PUSHJ P,SORT
FCYCLE: PUSHJ P,PUTUP ;PUT UP SCREEN FROM DIPFIL, POINT AT CURFIL
FFCYCL: PUSHJ P,ARROW ;PUT ARROW UP IN C 1, RETURN HERE FOR FASTEST RE-DSP
OCYCLE: SNEAKS ;DON'T OK ME, IM TALKING TO YOU!
JRST [ OUTSTR [ASCIZ /OK /] ↔ JRST .+2]
OUTCHR [" "]
RIHANG:SETZM ARGSGN ;INDICATE SIGN IS +
SETZM ARGF ;INDICATE NO ARG AVAILABLE
SETZM ARG ;AND SET ARG TO ZERO
IHANG: INCHRW A ;CAN'T THINK OF ANYTHING BETTER TO DO NOW
ISTHIS (A,tjum,T,T,F,T) ;show arg*4 mose lines at top
ISTHIS (A,JJUMP,J,T,F,T) ;JUMP GOES TO WJMP (αJ OR αβJ)
ISTHIS (A,bjum,B,T,F,T) ;show arg*4 more lines at bottom
ISTHIS (A,SETMAS,M,T,F,T) ;αβM IS READ A MASK
ISTHIS (A,ANDJUM,∧,T,F,T) ;MOVE CURSOR TO ARGTH LINE FROM TOP
ISTHIS (A,ORJUM,∨,T,F,T) ; " " BOTTOM
ISTHIS (A,LJUM,L,T,F,T) ;ARGTH LINE
CAIN A,"/"
JRST SWITCH
CAIN A,"[" ;IS THIS GUY TRYING TO GIVE US A PPN?
JRST RPPN
CAIN A," "
JRST LINE
ISTHIS (A,UEXIT,E,T,T,T) ;αβE IS EXIT (ALSO αE OR βE)
ISTHIS (A,WDOWN,W,T,F,T) ;WINDOW DOWN?
CAIN A,14 ;FORM IS SAME AS ↑
JRST WDOWN
CAIN A,13 ;VT IS UP
JRST WUP
TRNN F,%DEBUG ;βV IS DEBUG MODE IS DEFINED
JRST DECD1
ISTHIS (A,CYCLE,V,F,T,F);βV IS RE READ UFD IN DEBUG MODE
DECD1: ISTHIS (A,<[ PUSHJ P,DPYINI ;SET UP DISPLAY
JRST FCYCLE ;NOW PUT UP DISPLAY
]>,V,T,F,T) ;RE DRAW SCREEN
CAIN A,600+"≡" ;GO TO DDT?
JRST UDDT
CAIL A,600+"0"
CAILE A,600+"9"
JRST .+2 ;NOT A NUMBER
JRST ARGIN ;GOBBLE THIS DIGIT
CAIL A,200+"0"
CAILE A,200+"9"
JRST .+2 ;FOR SURE NOT A NUMBER
JRST ARGIN ;AND WHERE'S YOUR POINT?
CAIE A,600+"-" ;IS THIS A -?
CAIN A,200+"-"
JRST ARGNEG
CAIE A,600+"∞" ;IS THIS GUY TRYING TO TELL US SOMETHING?
CAIN A,200+"∞"
JRST ARGINF ;I GUESS SO
ISTHIS (A,DELETE,D,T,F,T) ;A DELETE?
CAIN A,"?" ;HUH?
JRST HELP ;SET THE TURKEY FLAG
CAIE A,600+">"
CAIN A,200+">" ;DOWN?
JRST DN
CAIE A,600+"<" ;UP?
CAIN A,200+"<"
JRST UPJ
CAIN A,15 ;CR
JRST DNO
CAIE A,200+"≥" ;DOWN ON α≥
CAIN A,600+"≥" ;DOWN ON αβ≥ TOO
JRST DNE
ISTHIS(A,UPO,U,T,F,T)
CAIE A,200+177 ;correction by REF 9/16/77 was 200+""
CAIN A,177 ;correction by REF 9/16/77 was ""
JRST UPO
CAIN A,600+177
JRST UPO
CAIE A,200+"≤"
CAIN A,600+"≤" ;THIS TOO
JRST UPE
;CONTINUED ON OTHER SIDE OF COMMENT
CAIE A,12 ;LF IS NO OP
JRST HUH
TRNN F,%START ;UNLESS THIS IS THE LF FROM MONITOR COMMAND LINE
JRST RCYCLE
JRST RIHANG
HUH: OUTSTR [ASCIZ / Unknown command - /]
TRZE A,200 ;DIRECT IF CONTROL BIT ON IN BAD COMMAND TYPED
OUTSTR [ASCIZ /<CONTROL>/]
TRZE A,400 ;DIRECT IF META BIT ON IN BAD COMMAND
OUTSTR [ASCIZ /<META>/]
XCT CHRS(A)
; OUTCHR A
OUTSTR [ASCIZ /
/]↔ JRST RIHANG
CHRS: 0
FOR ZZ←"↓","λ",1 <
OUTCHR [ZZ]
>
OUTSTR [ASCIZ /TAB/]
OUTSTR [ASCIZ /LF/]
OUTSTR [ASCIZ /VT/]
OUTSTR [ASCIZ /FF/]
OUTSTR [ASCIZ /CR/]
FOR ZZ←"∞","∨",1 <
OUTCHR [ZZ]
>
OUTSTR [ASCIZ /SPACE/]
FOR ZZ←"!","|",1 <
OUTCHR [ZZ]
>
OUTSTR [ASCIZ /ALT/]
OUTCHR ["}"]
OUTSTR [ASCIZ /BS/]
JRST 4,RIHANG
COMMENT ⊗ Switch Decoder ⊗
TO←←D
BO←←E
SWITCH: MOVE A,[440700,,(I)] ;I WILL HAVE PTR TO TEXT FROM COMTAB VIA D OR E
MOVEM A,BP7
MOVEI TO, ;CLOSE IN ON COMMAND FROM THE TOP
MOVEI BO,COMLEN ;CLOSE IN ON COMMAND FROM THE BOTTOM OF COMMAND LIST
SWL0: IBP BP7
SWL1: INWAIT ;GET A CHR. IF IT IS A / DONT REMOVE IT FROM THE INPUT BFR,
SNEAKS A, ; AND PRETEND IT WAS A CR (END OF COMMAND)
JRST 4,.
CAIE A,"[" ;DO THE SAME FOR...
CAIN A,"/" ;SLASH?
JRST SWCR ;YES, BUT LEAVE IT THERE SO TOP LEVEL COMMAND DECODER WILL
;CALL US AGAIN AFTER THE SWITCH JUST TYPED DOES ITS THING
INCHWL A ;WASN'T /, GET THE CHR OUT OF BUFFER
CAIN A,"[" ;ARE WE BEING FALSELY ACCUSED OF READING A PPN?
JRST RPPN ;YES, PASS THE BUCK
CAIE A,15 ;CR
JRST SWNM
; SNEAKS A, ;CHECK TO SEE IF THIS IS A LF AFTER THE CR
; JRST SWCR
; CAIN A,12
; INCHRW ;YEP, IT WAS A LF, REMOVE IT
SWCR: CAMN D,E ;IS THE COMMAND DECODED SO FAR AMBIG.?
JRST @DOTAB(D) ; NOPE, THEY ARGEE ON COMMAND TO RUN
MOVEI B, ;BEFORE WE DECIDE THIS IS AMBIG, SEE THAT IT IS NOT AN
MOVE I,COMTAB(D);ARGUMENT BETWEEN COMMANDS LIKE "BAG" AND "BAGS"
LDB B,BP7
JUMPE B,@DOTAB(D); YEP, THE ASCII 0 WAS FOOLIN US
JRST AMBH ;BARF AT LUSER
SWNM: CAIL A,141
CAILE A,172
JRST .+2
SUBI A,40
ROARDN: MOVE I,COMTAB(TO)
LDB B,BP7
CAMN A,B
JRST ROARUP
CAML TO,BO
JRST BADCHR
AOJA TO,ROARDN
ROARUP: MOVE I,COMTAB(BO)
LDB B,BP7
CAMN A,B
JRST SWL0
CAMN TO,BO
JRST 4,.
SOJA BO,ROARUP
BADCHR: OUTSTR [ASCIZ /I Don't know that switch.
/]↔ CLRBFI
JRST BADCH1 ;ABORT READING OF SWITCH
BADCH1: TRNE F,%START ;ARE WE FULLY STARTED OR READING COMMAND LINE SW'S
JRST RIHANG ;FULLY STARTED
EXIT ;NO, READING INITAL SWS
AMBH: OUTSTR [ASCIZ /Ambiguous Switch.
/]
CLRBFI ;FLS INPUT BUFFER
JRST AMBH1
AMBH1: TRNE F,%START ;ARE WE READING INITIAL SW'S OR ARE WE RUNNING
JRST RIHANG ;WE ARE RUNNING
EXIT ;NOT RUNNING
COMMENT ⊗ Cursor up and down ⊗
define down (a0,a1,a2,a3,a4) < ; 1→LOOP,2→END
a0: ARGET D,1,a4 ;GET ARG INTO D, DEFAULT IS 1
MOVE A,CURFIL ;GET CURRENT SCREEN SETTINGS FOR MUNGING AROUND WITH
MOVE B,DIPFIL
a1: SOJL D,a2 ;ITERATE ON PROCESS ARG TIMES
ADDI A,a3 ;CR MEANS INCR. CURFIL BY ONE
CAMLE A,TFILE1 ;DIRECT IF THIS HAS CAUSED US TO FALL OF THE END OF DIRECTORY
JRST [ MOVE A,TFILE1 ;THEN PATCH IT SO WE ARE JUST AT THE END OF DIR
MOVE B,TFILE1 ;THEN GIVE A2 REDICULOUS DIPFIL, IT WILL FIX IT
JRST A2]; JUST PRETEND HE WENT TO THE LAST LINE INSTEAD
CAIg A,NLINES-1-GLTP(B) ;skip IF CURFIL IS OFF END OF SCREEN, BUMP DIPFIL TO WIN
JRST A1 ;HAPPY, EXIT, BUT LOOP AGAIN IF ARG GIVEN WANTS US TO
ADDI B,GLTBY ;CONTINUE MOVING DOWN IN DIRECTORY UNTIL WE HAVE SATISFIED GLITCHP
JRST .-3 ; " "
a2: MOVEM A,CURFIL ;SAVE OUR CHANGES TO DISPLAY INFORMATION
MOVE C,B
ADDI C,NLINES
CAMLE C,TFILE
SKIPG B
SKIPA
SUBI B,1
CAMN B,DIPFIL ;HAVE WE CHANGED THE WINDOW? (SKIP IF T)
JRST FFCYCLE ; WE ONLY HAVE TO DISPLAY NEW ARROW, NOT NEW WINDOW
MOVE A,TFILE ;CHECK TO SEE IF GLITCH HAS GONE TO FAR, ONLY IF THERE
CAIGE A,NLINES ;ARE ENOUGH FILES TO FILL AN ENTIRE SCREEN
HRRM A,.+1
; JRST .+4
SUBI A,NLINES
CAIGE A,(B) ;SKIP IF DIPFIL IS SMALL ENOUGH
MOVE B,A ;USE LARGEST DIPFIL THAT GETS A WHOLE SCREEN
MOVEM B,DIPFIL ;THE WINDOW ON THE WORLD IS DIFFENT, SAVE IT
MOVEI NLINES
HRRM .-5
JRST FCYCLE ;AND PUT UP NEW DISPLAY FROM THE TOP
>
define up (a0,a1,a2,a3,a4,A5) < ;1→LUP,2→L (BUMP WINDOW),3→END
a0: ARGET D,1,A5
MOVE A,CURFIL
MOVE B,DIPFIL ;GET DISPLAY INFORMATION TO MUNG AROUND WITH
a1: SOJL D,UPOEND ;DO THIS ARG TIMES
SUBI A,a4 ;MOVE UP
CAIGE A, ;DIRECT IF WE HAVE MOVED PAST BEGINING OF DIRECTORY
JRST [ MOVEI A, ;THEN PRETEND WE WERE AT THE TOP AND EXIT
MOVEI B, ;PRETEND WE ARE AT TOP
JRST A3] ;PRETEND IT WAS THE FIRST INSTEAD
a2: MOVE C,A↔SUB C,B;PUT CURFIL RELATIVE TO TOP OF SCREEN IN C
CAIL C,GLTP ;SKIP IF WE NEED TO GLITCH BECAUSE TO CLOSE TO TOP OF SCN
JRST A1 ;DO ENTIRE THING ARG TIMES, OTHER THAN THAT, THIS IS EXIT
SUBI B,GLTBY ;KEEP BUMPING B (WINDOW) TILL GLITCHP IS HAPPY
JRST A2
a3: MOVEM A,CURFIL ;SAVE OUT MUNGAGE ON CURFIL
CAIGE B, ;IF DIPFIL IS NEG
MOVEI B, ;CALL IT ZERO, IT MEANS WINDOWING OVERSHOT BEG WHILE ADJUSTN
CAMN B,DIPFIL ;HAVE WE CHANGED THE WINDOW
JRST FFCYCLE ;NO, DONT NEED TO SAVE THIS, FAST DISPLAY
MOVEM B,DIPFIL
JRST FCYCLE
>
DNO: TRO F,%NOOK
DOWN DNOZ,DNOLUP,DNOEND,1,UPO
DOWN DN,DNLUP,DNEND,4,UPJ
DOWN DNE,DNELUP,DNEEND,<NLINES/2>,UPE
UPO: TRNN F,%START ;SKIP IF WE HAVE DONE PROPER INIT STUFF
JRST RIHANG ;ASSUME THIS WAS THE CR AT THE END OF MONITOR COMMAND
;FALL THRU TO UPOQ
UP UPOQ,UPOLUP,UPO1,UPOEND,1,DNO
UP UPJ,UPLUP,UP1,UPEND,4,DN
UP UPE,UPELUP,UPE1,UPEEND,<NLINES/2>,DNE
;JMP: MOVE A,CURFIL ;αβJ COMMAND
Comment ⊗ Window up and down ⊗
WDOWN: move a,curfil ;arrow
move b,dipfil ;top of screen
arget d,1,WUP ;arg in d, default 1, wup if negative
subi d,1 ;jump arg-1 windows
imuli d,nlines-1
addi b,(d)
move c,tfile ;tfile-nlines is max dipfil
subi c,nlines
caige c,
movei c,
caile b,(c) ;direct if new dipfil gr max
move b,c ; use max
move d,b ;new arrow is bottom line of this window
addi d,nlines ;plus nlines
camle d,tfile ;(correct if off end)
move d,tfile
movei a,-1(d) ;-1 is new arrow
addi b,nlines-1 ;choose final window
caile b,(c) ;direct if new dipfil gr max
move b,c
movem a,curfil
movem b,dipfil
jrst fcycle
wup: move a,curfil
move b,dipfil
arget d,1,wdown
subi d,1
imuli d,nlines-1
subi b,(d)
caige b,
movei b,
move a,b
subi b,nlines-1
caige b,
movei b,
movem a,curfil
movem b,dipfil
jrst fcycle
jjump: skipe argf
skipe arg
jrst .+2
jrst jjum3
skipe argsgn ;skip if no sign
jrst jjum2
move a,tfile
subi a,nlines
caige a,
movei a,
move b,curfil
caile b,(a)
move b,a
skipe argf
pushj p,jjum1
movem b,dipfil
jrst fcycle
jjum1: move a,arg
add a,dipfil
caile a,(b)
move a,b
move b,a
popj p,
jjum2: move a,curfil
subi a,nlines-1
caige a,
movei a,
skipn argf
movni b,nfiles
skipe argf
movn b,arg
add b,dipfil
caige b,(a)
move b,a
movem b,dipfil
jrst fcycle
jjum3: jrst fcycle ;jump middle one of these days
tjum: ;make arg*four more lines visable at the top
arget (a,1,bjum)
imuli a,4
move b,dipfil
subi b,(a)
caige b, ;off the top
movei b,
movem b,dipfil
addi b,nlines-1 ;is lowest allowed arrow location
camge b,curfil
movem b,curfil
jrst fcycle
bjum: ;make arg*four more lines visable at the bottom
arget (a,1,tjum)
imuli a,4
add a,dipfil ;new desired dipfil
move b,tfile
subi b,nlines ;max dipfil value for full screen
caige b, ;file list shorter than screen
movei b,
caile a,(b) ;proposed dipfil too big?
move a,b
movem a,dipfil
camle a,curfil ;backed up over cursor?
movem a,curfil
jrst fcycle
andjum: ;∧ ;move cursor to argth line from top of window
arget (a,1,orjum)
caile a,nlines
movei a,nlines
subi a,1
add a,dipfil
movem a,curfil
jrst fcycle
orjum: ;∨ ;move cursor to argth line from bottom of window
arget (a,1,andjum)
move b,tfile
caile b,nlines
movei b,nlines
caile a,(b)
movei a,(b)
movn a,a
addi a,(b)
add a,dipfil
movem a,curfil
jrst fcycle
ljum: ;move cursor to argth line
arget (a,1,lljum)
caig a,
movei a,1
camle a,tfile
move a,tfile
subi a,1
ljum0: movem a,curfil
move b,dipfil
addi b,nlines-1
caig a,(b) ;cursor off bottom?
camge a,dipfil ;cursor off top of current window?
jrst ljum1
jrst fcycle
ljum1: subi a,nlines/2
move b,tfile
subi b,nlines ;max dipfil value for full screen
caile a,(b)
move a,b
caige a,
movei a,
movem a,dipfil
jrst fcycle
lljum: arget (a,1,ljum)
movn a,a
add a,curfil
caige a,
movei a,
jrst ljum0
COMMENT ⊗ Enter E on current file ⊗
EDITR: SETOM EDITRR ;EDIT IN /R MODE
EDITF:
SKIPN TFILE ;ARE THERE ANY FILES IN THE UFD
JRST EDITNF ;NO FILE TO EDIT
SKIPE DELIS0 ;TYPE MSG. IF THERE IS AT LEAST 1 FILE TO DELETE
OUTSTR [ASCIZ /Running your delete list.../]
PUSHJ P,XITING ;RUN DELETE LIST, AND ANYTHING ELSE THAT MAY BE STUCK IN THERE
TRNN F,%GETTY ;ON A DD..
PUSHJ P,ZCLEAR ;CLEAR THE SCREEN
PUSHJ P,WTMPC ;WRITE A TEMP CORE FILE SO WE CAN RESTRT
SETZM DIRLIN ;ZERO DIRLIN SO PTWRS9 KNOWS WHERE TO STOP
MOVE A,[DIRLIN,,DIRLIN+1]
BLT A,DIRLIN+DIRLEN-1
MOVE A,[441100,,DIRLIN] ;BYTE POINTER FOR PREPATING COMMAND
MOVEM A,BP7
MOVEI A,600 ;CALL
IDPB A,BP7
IDPB A,BP7
SGEN [ASCIZ /R E;↓/] ;USE R E, NOT ET SO IT DOESNT CLOBBER LUSERS E TMPCOR
TYPE6 6,LOSS0 ;NOW TELL E THE DEVICE NAME
SGEN [ASCIZ /↓:↓/] ;THE 2ND ↓ IS FOR THE FILE NAME, COMMING UP
MOVE A,CURFIL ;FIND OUT WHAT FILE THIS GUY WANTS TO EDIT
MOVE A,FILES(A)
CAMN A,[-1] ;-1 SHOULD ONLY BE THERE IN THE CASE WHERE THERE ARE NO FILES
JRST 4,. ;FILE DOES NOT EXIST???
MOVE B,UFD(A) ;THIS WILL BE FILE NAME ONE
TYPE6 6,B
SGEN [ASCIZ /↓.↓/]
MOVE B,UFD2(A) ;GET THE EXT OF THIS FILE
TYPE6 3,B
SGEN [ASCIZ "↓["]
MOVE B,LLUSER(A);GET PPN OF THE FILE TO BE EDITED
MOVE C,[440600,,B]
REPEAT 3,{ILDB D,C ↔ ADDI D,40 ↔ IDPB D,BP7}
SGEN [ASCIZ /,/]
REPEAT 3,{ILDB D,C ↔ ADDI D,40 ↔ IDPB D,BP7}
SGEN [ASCIZ "]"]
ARGET A,1,<[MOVM A,A↔JRST EDIT1]>
EDIT1: SGEN [ASCIZ "/"] ;AND TELL E TO START UP ON THAT PAGE
SPRINT =10,A
SGEN [ASCIZ /P/] ;FOR PAGE , I.E. ET ... /69P
SKIPE EDITRR ;EDIT IN /R MODE?
SGEN [ASCIZ "/R"]
SETZM EDITRR
SPRINT 8,[-3] ;PUT A CR, W/O LF IN STRING TO GET IT GOING
OUTSTR [ASCIZ /
/] ;CLEAR OLD NONSENSE
DPYPOS -1069 ;POSITION POP OF END OF SCREEN SO THIS IS NOT VISABLE
PTWRS9 [0↔DIRLIN] ;SHOULD RUN E ON THIS FILE
JRST 4,. ;WE SHOULD NOT BE RUNNING HERE
EDITNF: OUTSTR [ASCIZ /
There is no file to edit.
/]↔ JRST RIHANG
COMMENT ⊗ Delete HAS BEEN DELETED
THIS CRAPP IS UNUSED !!!
DELETE: PUSH P,A↔PUSH P,B↔PUSH P,C↔PUSH P,D↔PUSH P,E
SKIPE ARGF ;IS THERE AN ARG?
SKIPA A,ARG
MOVEI A,1
SKIPE ARGSGN ;NEG ARG MEANS UNDELETE ONE FILE
JRST UNDEL
MOVE B,CURFIL
DELLOP: PUSH P,B ;B IS USED FOR DELETING SCR FILE, AND FILES POINTER IN LOOP
MOVE B,[['......'↔'... '↔0],,DELBLK]
BLT B,DELBLK+2 ;DELETE OLD SCRATCH FILE IF IT EXISTS
MOVE B,LUSER ;SET UP PPN TOO
MOVEM B,DELBLK+3
MOVEM B,RENBLK+3 ;RENAME WANT THIS PPN ALSO
SETZM RENBLK ;SO RENAME WILL DELETE IT
LOOKUP FIL,DELBLK
JRST DELPRO ;IF IT DOES NOT EXIST THAT IS FINE, DONT DELETE IT
RENAME FIL,RENBLK
JRST 4,. ;HUH?
DELPRO: CLOSE FIL, ;SCRAM
POP P,B ;B USED FOR DELETING SCR FILE
;A IS LOOP COUNTER, SOURCE IS ARG TO αβD.
;B HAS IDX INTO FILES (0-* AS FILES APPEAR ON SCREEN) AOSED EACH TIME THRU
MOVE C,FILES(B) ;LOOP DELETING FILE IN A (WHICH IS IDX→FILES
CAMN C,[-1] ;DOES THIS FILE REALLY EXIST, OR HAVE WE OVERSHOT
JRST DELDON ;DONE, NO MORE FILES TO FLUSH
MOVEM C,OLDFIL ;SAVE UFD POINTER INCASE THIS FILE GETS UNDELETED
MOVE D,UFD(C) ;GET FIRST FILE NAME
MOVEM D,DELBLK
MOVE D,UFD2(C) ;GET EXT
MOVEM D,DELBLK+1
MOVE D,LUSER ;GET PPN WE ARE DEALING WITH
MOVEM D,DELBLK+3
LOOKUP FIL,DELBLK ;FILE WE ARE DELETING
JRST 4,.
MOVS D,DELBLK+3 ;TAKE THIS NUMBER OF WORDS OFF OF TOTAL
ADDM D,WORDS ;D CONTIANS -NUMBER OF WORD
SOS TFILE ↔ SOS TFILE1 ;DECREMENT LOCS CONTAINING NUMBER OF FILES
MOVE D,['......'] ;RENAME TO THIS WHEN YOU DELETE, SO IT CAN BE RECOVD
MOVEM D,RENBLK
MOVSI D,'...' ;THIS EXT
MOVEM D,RENBLK+1
MOVE D,DELBLK+2 ;GET OLD PRO, MODE, DATE, ETC
MOVEM D,RENBLK+2;KEEP THE SAME
MOVE D,LUSER
MOVEM D,RENBLK+3
RENAME FIL,RENBLK
JRST 4,.
REMOVE B ;REMOVE THIS FILES FROM CORE DATA
SOJG A,DELLOP
JRST DELDON ;DONE, WE HAVE DELETED ALL WE WERE TOLD TO
UNDEL: MOVE A,DELBLK ;GET NAME OF FILE LAST DELETED
CAMN A,['......']
JRST UNDEL2 ;LAST FILE DELETED HAS ALREADY BE UNDELETED
MOVEM A,RENBLK ;PREPARE TO RECOVER IT
MOVE A,DELBLK+1 ;GET EXT
MOVEM A,RENBLK+1
MOVE A,['......'] ;FOR LOOKUP, TO RECOVER
MOVEM A,DELBLK
MOVSI A,'...'
MOVEM A,DELBLK+1
MOVE A,LUSER
MOVEM A,DELBLK+3
OUTSTR [ASCIZ /
Undeleting File /]↔pushj p,filprn
OUTSTR [ASCIZ / - /]
LOOKUP FIL,DELBLK ;THE SCR FILE IS BEING RENAMED TO LAST FILE DELTED
JRST 4,.
MOVS A,DELBLK+3 ;THIS IS THE -SIZE OF THE FIL IN A, ADD FILE SIZE
SUBM A,WORDS ; TO WORD COUNT (BY SUBTRACTING, WE HAVE -WORD CNT)
AOS TFILE ↔ AOS TFILE1 ;INCREMENT LOCS WITH NUMBER OF FILES
RENAME FIL,RENBLK
JRST 4,.
JRST NDELDON
UNDEL2: OUTSTR [ASCIZ /There is no file to undelete.
/]↔ POP P,E↔POP P,D↔POP P,C↔POP P,B↔POP P,A
JRST RIHANG
NDELDO: ;NOW MUST RECONSTRUCT FILES TABLE AND LOOKDAT TABLE
MOVEI A, ;LOOK FOR A FREE ENTRY IN FILES TABLE
NDELD1: MOVE B,FILES(A) ;GET THIS ONE
CAME B,[-1] ;SKIP IF WE HAVE FOUND ONE
AOJA A,NDELD1 ;TRY NEXT ENTRY
MOVE B,OLDFIL ;GET OLD UFD POINTER
MOVEM B,FILES(A);RE-INSTALL IT IN FILES TABLE
MOVE B,[RENBLK,,UFDIN] ;BLT RECOVERED FILE NAME INTO LONG LOOKUP BLOCK
BLT B,UFDIN+1 ;ONLY THE FILESNAMES ARE LOOKED AT BY FLOOKUP
FLOOKUP ;WILL ADD LOOKUP DATA TO LUKDAT
JRST 4,.
POP P,E↔POP P,D↔POP P,C↔POP P,B↔POP P,A↔JRST SCYCLE
DELDON: PUSHJ P,ZCLEAR ;CLEAR DIRECTORY AREA OF SCREEN
POP P,E↔POP P,D↔POP P,C↔POP P,B↔POP P,A
JRST FCYCLE
FILPRN: PUSH P,A↔PUSH P,B
MOVE A,[440600,,RENBLK]
REPEAT 6,{ILDB B,A↔ADDI B,40↔OUTCHR B}
OUTCHR [11]
MOVE A,[440600,,RENBLK+1]
REPEAT 3,{ILDB B,A↔ADDI B,40↔OUTCHR B}
POP P,B↔POP P,A↔POPJ P,
THIS CRAP IS NOT USED !!!!
⊗
COMMENT ⊗ New Delete System ⊗
DELETE: ARGET A,1,UNDEL ;PUT REPEAT ARG IN A, DEFAULT IS 1, NEGATIVE MEANS UNDEL
TRNE F,%DDELS ;DIRECT IF WE ARE DISPLAYING DELETE LIST
JRST DELR ;DELETE FROM DELETE LIST
DELOOP: SOJL A,DELDON ;ARG TIMES ON THE FOLLLOWING
MOVEI B, ;FIND FIRST FREE SLOT IN DELETE LIST
DELL1: MOVE C,DELIS0(B) ;0 IN WORD OF DELIS0 IS FREE SLOT, -1 IS LOSE
CAIN C,
JRST DELE1 ;WIN, FOUND EMPTY SLOT
CAMN C,[-1] ;HAVE WE HIT ROCK BOTTOM IN DELETE LIST?
JRST FATL06 ;YEP
AOJA B,DELL1 ;TRY NEXT SLOT IN DELETE LIST
DELE1: ;A NOW IS LOOP COUNTER, B IS FREE SLOT IN DELETE LIST
MOVE C,CURFIL ;SO, WHAT IS THIS THE LUSER WANTS US TO FLS?
MOVE D,FILES(C) ;PICK UP UFD IDX FOR FILE TO FLS
CAMN D,[-1] ;IS THIS FILE UNDELETEABLE (DOES NOT EXIST)
JRST DELDON ;YES, NO USE RUNNING THRU THIS SILLY LOOP...
MOVE C,UFD(D) ;GET FIRST FILE NAME FROM UFD OF FILE TO FLS
MOVEM C,DELIS0(B) ;STUFF THIS IN FREE CELL IN DELETE LIST
MOVEM C,UFDIN ;FOR CHECK OF THE 'COPY' DELETE PROTECT BIT
MOVE C,LLUSER(D) ;GET THE PPN
MOVEM C,DELIS2(B)
MOVEM C,UFDIN+3
MOVE C,UFD2(D) ;GET THE EXT OF FILE TO FLS
MOVEM C,UFDIN+1
HRR C,D ;CLOBBER RH WITH IDX INTO UFD
MOVEM C,DELIS1(B) ;AND PUT IT IN DELETE LIST
FLOOKUP ;CHECK THE 200 BIT OF PRO. KEY, IF ON ASK USER IF HE
JRST 4,. ;REALLY WANTS TO DELETE THIS FILE. ALWAYS SKIPS.
MOVE C,UFDIN+2 ;PRO IS IN HIGH 9. OF THIS
TLNE C,200000
JRST DELQU ;ASK USER IF HE REALLY MEANS IT
DELQR: SOS TFILE ↔ SOS TFILE1 ;DECREMENT COUNTERS OF NUMBER OF FILES IN THIS UFD
REMOVE CURFIL ;REMOVE FILE JUST PUT IN DELETE LIST FROM CORE DATA
MOVE C,CURFIL ;SEE IF WE JUST DELETED THE LAST THING ON THE SCREEN
CAME C,TFILE ;SINCE BOTH WERE JUST DECRMD., ARE WE NOW POINTING AT STARS?
JRST DELOOP ;LOOP ON THIS ARG TIMES
JUMPE C,DELOOP
SOS CURFIL ;YEP, CAUSE IT TO POINT AT FILE ABOVE,
;AND FALL THRU TO DELDON, NO MORE TO DELETE NO MATTER WHAT ARG SAYS
DELDON: JRST FCYCLE
DELQU: OUTSTR [ASCIZ /
Do you really want to delete /]
TTY6 6,DELIS0(B) ;PRINT THE FIRST FILE NAME
OUTSTR [ASCIZ / /]
TTY6 3,DELIS1(B) ;PRINT THE EXT
OUTSTR [ASCIZ / [/]
TTY6 6,DELIS2(B)
OUTSTR [ASCIZ /] ?/]
INCHRW C ;C WAS FREE WHEN I WROTE THIS
OUTSTR [ASCIZ /
/]↔ CAIE C,"Y"
CAIN C,"y"
JRST DELQR ;HE SAID SO...
OUTSTR [ASCIZ /Spared.../]
SETZM DELIS0(B) ;UNDO THE DAMAGE WE HAVE DONE TO THE DELETE LIST
SETZM DELIS1(B)
SETZM DELIS2(B)
SOJL A,DELDON ;AS IF WE WERE TOP OF ARG<DELETE> LOOP, BUT DONT MAKE
;US LOOK FOR SLOT, WE HAVE ONE NOW.
AOS CURFIL ;GO TO NEXT FILE, IF WE HAVE OVERSHOT FILES, DELE1 WILL KNOW
JRST DELE1
DELR: ;TAKE GUYS OUT OF DELETE LIST
MOVE D,(A)
MOVE A,CURFIL ;THIS IS THE ONE TO FLUSH
DELRL: SOJL D,SCYCLE
SKIPN B,DELIS0(A)
JRST SCYCLE ;SEEM TO BE THRU, HIT AN EMPTY CELL
PUSHJ P,INSERT ;INSERT THE DELIS FILE INDICATED BY A INTO FILES TABLE
MOVEM B,UFDIN ;WE WILL BE DOING A LOOKUP HERE
MOVE B,DELIS1(A);WE ARE INTERESTED IN THE EXT. STUFFED IN HERE
MOVEM B,UFDIN+1
MOVE B,DELIS2(A);THE PPN
MOVEM B,UFDIN+3
FLOOKUP
JRST 4,.
MOVS B,UFDIN+3 ;GET THE -SWAPPED WORD COUNT, UNSWAPPED
MOVN B,B ;GET WORD COUNT
ADDM B,WORDS ;BUMP THE WORD COUNT
AOS TFILES ;TELL THE WORLD THERE ARE MORE FILES, BUT TFILE IS
;HIDDEN IN TFILES
MOVE B,A
FIXGAP (B,DELIS0,NFILES,1) ;WIPE OUT ENTRY POINTED TO BY B
SETZM DELIS0+NFILES-1 ;THIS GOT A -1 FROM END OF TAB, IT WANTS 0
MOVE B,A
FIXGAP (B,DELIS1,NFILES,1) ;BY PRETENDING TO CLOSE A GAP
SETZM DELIS1+NFILES-1 ;THIS GOT A -1 FROM END OF TAB, IT WANTS 0
MOVE B,A
FIXGAP (B,DELIS2,NFILES,1)
SETZM DELIS2+NFILES-1 ;THIS GOT A -1 FROM END OF TAB, IT WANTS 0
JRST DELRL
UNDEL: MOVEI A, ;SET A UP WITH LARGEST IDX INTO DELETE LIST WITH A FILE IN IT
UNDL1: MOVE B,DELIS0(A)
CAME B,[-1] ;-1 OR 0 MEANS ONE ABOVE IS ONE WE SHOULD POINT AT
CAIN B,
JRST UNDE1 ;B NOW POINTS JUST AHEAD OF LAST FILE IN LIST
AOJA A,UNDL1 ;NEXT
UNDE1: ARGET B,1,<[JRST 4,UNDEL]> ;B IS LOOP COUNTER, A IS FILE TO UNDELETE
UNDLUP: SOJL B,UNDONE ;ITERATE ARG TIMES ON UNDELETE STUFF
SOJL A,UNDONE ;FILE TO REMOVE FROM DELETE LIST, STOP IF NO MORE TO UNDELETE
PUSHJ P,INSERT ;PUT THIS FILE BACK IN FILES TABLE
;NOW DO A FLOOKUP ON THIS FILE TO GET ITS LENGTH TO ADD TO WORD COUNT
MOVE C,DELIS0(A);THIS IS THE FIRST FILE NAME OF FILE WE ARE UNDELETEING
MOVEM C,UFDIN ;FOR FLOOKUP
MOVE C,DELIS1(A);ALL THIS HAS FOR US IS EXT.
MOVEM C,UFDIN+1
MOVE C,DELIS2(A);THE PPN OF THE FILE BEING UNDELTED
MOVEM C,UFDIN+3
FLOOKUP
JRST 4,. ;DOESNT GET HERE
MOVS C,UFDIN+3 ;THIS IS -SWAPPED WORD COUNT
MOVNS C,C
ADDM C,WORDS ;CHARGE USE FOR THIS SPACE
SETZM DELIS0(A) ;AND ZERO THIS ENTRY IN THE LIST
SETZM DELIS1(A)
SETZM DELIS2(A)
AOS TFILE ↔ AOS TFILE1 ;TELL FILE COUNTERS ABOUT UNDELETEING THIS FILE
JRST UNDLUP
UNDONE: JRST SCYCLE ;FOR NOW...
INSERT: SAVE A ↔ SAVE B ↔ SAVE C
MOVEI B, ;FIND FREE SLOT IN FILES
INS1: MOVE C,FILES(B)
CAME C,[-1] ;FREE SLOT
AOJA B,INS1
MOVE C,DELIS0(A) ;GET THE FIRST FILE NAME
HRR C,DELIS1(A) ;AND PUT IN THE UFD INDEX FOR THE FILES TABLE
MOVEM C,FILES(B)
CPOPJ3: POP P,C
CPOPJ2: POP P,B
CPOPJ1: POP P,A
POPJ P,
COMMENT ⊗ Put up new arrow ⊗
ARROW: SAVE A↔SAVE B
MOVE A,CURFIL ;CURFIL-DIPFIL IS LINE TO PUT ARROW ON
SUB A,DIPFIL
TRNE F,%GETTY ;SKIP IF DD
JRST ARRIII
IMULI A,14 ;14 RASTER SCAN LINES PER TEXT LINE
ADDI A,14*5 ;ITS A LARGE FENCE?
DPB A,[140400,,DDAMUN] ;GIVE LOLIN LOW ORDER 4 BITS OF VERT. POS
ASH A,-4
DPB A,[240500,,DDAMUN] ;GIVE HILIN HIGH ORDER 5 BITS
MOVE A,DDAMUN ;UPDATE ARROW FLS PROGRAM'S HILIN AND LOLIN
DDUPG [200000,,DDFLSA↔5↔0↔DDFMUN] ;FLUSH OLD ARROW
DDUPG [200000,,DDARRO↔5↔0↔DDAMUN] ;PUT UP NEW ARROW(BLAST FROM THE PAST)
MOVEM A,DDFMUN ;SO WE CAN FLS THIS NEW ARROW NEXT TIME
ARRXIT: POP P,C↔POP P,B
POPJ P,
ARRIII: IMUL A,[-30] ;30 PTS PER CHR
ADDI A,IIITOP ;Y POS OF FIRST LINE OF DIRECTORY TEXT
UPGMVE B,IIMUNG ;GET ARROW'S LONG VECTOR WORD
DPB A,[POINT 11,B,21]
UPGMVM B,IIMUNG ;MUNG!
JRST ARRXIT
COMMENT ⊗ Exit to DDT or World ⊗
UEXIT: SKIPE DELIS0 ;IF THERE IS AT LEAST ONE FILE TO DELETE TYPE MSG.
OUTSTR [ASCIZ /
Running your delete list.../]
PUSHJ P,XITING
PUSHJ P,WTMPC ;WRITE A TEMPCORE FILE
PUSHJ P,CLEAR
EXIT
UDDT: TRNE F,%GETTY ;ON III'S ONLY
PGACT ;TURN OFF III PROG RUNNING DISPLAYING DIRECT
TRNN F,%GETTY ;ON DD'S ONLY
DDUPG [200000,,DDFLSA↔5↔0↔DDFMUN]
MOVEM A,UDDTS
MOVEI A,UDDTRE ;SO ↑P'ING FROM DDT WILL WORK
MOVEM A,.JBOPC↑
MOVE A,UDDTS
JRST DDT↑
UDDTRE: PUSHJ P,DPYINI ;RESEDT DISPLAY AFTER THAT BOUT WITH RAID
JRST RIHANG
UDDTS: 0
;STUFF A HERE WHILE SETTING UP .JBOPC FOR DDT
COMMENT ⊗ Run Delete list, and clear ⊗
XITING:
TRNE F,%READO ;DIRECT RETURN IF IN READONLY MODE
POPJ P,
SAVE A ↔ SAVE B ↔ SAVE C
TRZN F,%DDELS ;IF WE ARE RUNNING THE DELETE LIST, GET THIS GUY OUT OF
;DELETE LIST DISPLAY MODE
JRST XITIP
SETZM CURFIL ;AND SET DISPLAY TO TOP
SETZM DIPFIL ;DIPFIS AND CURFIS ARE IRR SINCE %DDELS IS 0
XITIP: MOVSI A,-NFILES ;USE AS PTR INTO DELETE LIST
XITI1: MOVE B,DELIS0(A);FILE TO DELETE
CAIN B, ;OR IS IT ZERO, DIRECT IF NO MORE TO DELETE
JRST XIT2 ;ALL DELETED
MOVEM B,DELBLK ;FOR LOOKUP
MOVEM B,XITSV ;INCASE WE HAVE A PROTECT FAIL, TELL LUSER ABOUT IT
MOVE B,DELIS1(A)
MOVEM B,DELBLK+1
MOVE B,DELIS2(A);THIS IS THE PPN
MOVEM B,DELBLK+3
LOOKUP FIL,DELBLK
JRST XITER2 ;HMM. CANT FIND FILE WE ARE SUPPOSED TO DELETE
SETZM DELBLK ;0 FIRST FILE NAME TO RENAME MEANS DELETE
MOVEM B,DELBLK+3;THE LOOKUP CLOBBERED THE PPN
RENAME FIL,DELBLK
PUSHJ P,XITER ;THIS IS THE SAFEST ROOM IN THE. . .
XIT3: SETZM DELIS0(A) ;NOW ZERO THESE ENTRIES IN DELETE LIST
SETZM DELIS1(A)
SETZM DELIS2(A)
AOBJN A,XITI1
XIT2: POP P,C ↔ POP P,B ↔ POP P,A
POPJ P,
XITER2: ;GET HERE WHEN A FILE IN THE DELETE LIST IS NOT TO BE FOUND
HRRZ DELBLK+1 ;THIS IS THE ERROR CODE
CAIE ;IF THE ERROR IS OTHER THAN 0 GET UPSET
ERR 0,<I can't find a file which I'm sure is there.>
;GUESS THAT THE FILE WENT AWAY WHILE WE WERE HACKING. TELL THE USER
OUTSTR [ASCIZ /
The file /]
TTY6 6,DELBLK ;THE FIRST FILE NAME
OUTCHR [40]
TTY6 3,DELBLK+1 ;THE EXT.
OUTSTR [ASCIZ / [/]
TTY6 6,DELBLK+3 ;THE PPN
OUTSTR [ASCIZ /] has been deleted by another user./]
JRST XIT3 ;RETURN PRETENTING FILE HAS BEEN DELETED BY US, CONTINUE DELETELING
XITER: ;GET HERE WHEN WE CAN'T DELETE A FILE
PUSH P,A
HRRZ A,DELBLK+1 ;THE REASON THE RENAME FAILED IS HERE
CAIE A,2 ;IS PROTECT FAIL
ERR 0,<Oh loss! Delete fail for non-protection reasons on >,<
TTY6 6,XITSV
OUTCHR ["."]
TTY6 4,DELBLK+1;4 BECAUSE WE NEED A SPACE, AND ,,770000 IS GOING TO BE 0
TTY6 6,DELBLK+3
>,< Get a wizard.>
OUTSTR [ASCIZ /
The file /]
TTY6 6,XITSV ;TYPE THE FIRST FILE NAME OF THE FILE PROTECTED
OUTCHR ["."]
TTY6 3,DELBLK+1 ;THIS IS THE EXT
OUTCHR ["["]
TTY6 6,DELBLK+3 ;THE PPN
OUTCHR ["]"]
OUTSTR [ASCIZ / is protected from deletion against you.
Type Y to continue running delete list: /] ;OTHERWISE GO EDIT
CLRBFI
INCHRW A
CAIE A,"Y"
CAIN A,"y"
JRST XITER1 ;THE GUY WANTS TO GO ON
MOVE P,[-PDS,,PDL-1] ;TOTALLY FLUSH RANDOM PDL
CLRBFI
JRST FCYCLE
XITER1: POP P,A
POPJ P,
XITSV: -1 ;KEEP FILE NAME ONE HERE FOR TELLING LUSER ABOUT RENAME FAIL
COMMENT ⊗ Gobble argument ⊗
ARGIN: SETOM ARGF ;TURN ON ARG FLAG
MOVE B,ARG ;GET ARG SO FAR
IMULI B,=10 ;TAKE THAT!
TRZ A,600 ;TURN OFF CONTROL AND META BITS (αβ OR β)
ADDI B,-"0"(A)
MOVEM B,ARG ;SAVE UPDATED ARG AWAY
JRST IHANG ;THAT'S IT, NO UPDATEING OF SCREEN NEEDED
ARGINF: MOVEI A,NFILES
MOVEM A,ARG
SETOM ARGF
JRST IHANG
ARGNEG: SETOM ARGSGN
JRST IHANG
ARG: 0
ARGF: 0 ;0 ==> NO ARG, -1 ==> SEE ARG
ARGSGN: 0 ;-1 ==> SIGN BIT ONE
COMMENT ⊗ Put up a display ⊗
PUTUP: SAVE A↔SAVE B↔SAVE C↔SAVE D
TRNE F,%DDELS ;DIRECT IF WE SHOULD DISPLAY THE DELETE LIST
JRST PUTDL ;WELL, DO IT
MOVE A,CURFIL ;CHECK TO SEE IF CURFIL IS TO LARGE
CAMLE A,TFILE1 ;SKIP IF CURFIL IS REASONABLE
SKIPN A,TFILE ;DIRECT IF 0, DONT BARF BECAUSE THERE ARE NO FILES IN THIS UFD
SKIPA A,TFILE ;NO ERR
JRST FALT04 ;THERE ARE SOME NUMBER OF FILES, AND CURFIL IS REDICULOUS
PUTREC: MOVEI A,1 ;FILL DIRLIN WITH THIS SO DD WILL LIKE CHRS
MOVEM A,DIRLIN
MOVE A,[DIRLIN,,DIRLIN+1]
BLT A,DIRLIN+DIRLEN-1
MOVE A,[440700,,DIRLIN] ;GENTXT WANTS BP SET UP FOR IT
MOVEM A,BP7
SETZM ZERO
;PUT UP SIZE, PROTECTION LINE
TRNE F,%TTY ;XTRA CRLF ON TTYS
OUTSTR [ASCIZ /
/]↔ SGEN [ASCIZ /......PPN = /]
TYPE6 6,LUSER ;CRANK OUT PPN FOR UPPER LINE
TRNE F,%FAST ;DIRECT IF WE ARE IN FAST MODE, WORDS IS USELESS
JRST PUT11
SGEN [ASCIZ / ....... Total /]
TYPE6 4,LOSS0 ;THE DEVICE NAME
SGEN [ASCIZ / Space in Words = /]
MOVE A,WORDS
TRNN F,%KMODE ;PRINT DSK WORD SIZEZ ≥ 1000 IN K'S?
JRST .+3 ;SKIP OVER KMODE STUFF
CAIL A,=1024 ;IF GREATER OR = TO 1000 PRINT AS 69 K, NOT 69000
JRST [ IDIVI A,=1024
SPRINT =10,A
SGEN [ASCIZ /./]
SPRINT =10,B
SGEN [ASCIZ / K /]
JRST PUT11]
SPRINT =10,A ;OTHERWISE JUST PRINT AS WORDS
PUT11: SGEN [ASCIZ / ....../]
SPRINT 8,[-36] ;CRLF
SKIPN ANYWHO ;NON 0 ANYWHO MEANS THERE IS AT LEAST ONE FULL FILE
; TRNE F,%FAST ;USE A DIFFERENT HEADER FOR FAST MODE
HEDLI2: SGENA [ASCIZ /Filnam Ext P PN
/]
HEDLIN: SGEN [ASCIZ /Filnam Ext P PN Size Date Time Pro Writer Reference Dump
/]↔ SKIPE DIPFIL ;SKIP IF STARS BELONG AT TOP, DIRECT IF -'S
SKIPA A,STRIPE ;LOAD A WITH POINTER TO --'S FOR TOP LINE
MOVE A,STARS ;OR LOAD WITH PT. TO *'S
TRNE F,%TTY ;DIRECT IF ON A TTY
JRST [ OUTSTR [ASCIZ /
/]↔ MOVSI A,400000 ;SO AOBJN WILL NOT EXPIRE
JRST PUTL1] ;GEN. TEXT.
SGEN @A ;OUTPUT IT ON BP7
SKIPE DELIS0 ;IF THERE IS A FILE ASKING TO BE DELETED
SGEN [ASCIZ / W/] ;INCLUDE THIS
TRNE F,%READO ;IF WE ARE IN READONLY MODE SAY SOMETHING
SGEN [ASCIZ ∧ /R∧]
SPRINT 8,[-36] ;FOLLOWED BY CRLF
MOVE A,DIPFIL ;USE A AS IDX INTO FILES, AND FOR GENTXT
HRLI A,-NLINES ;FOR AOBJN
PUTL1: MOVE B,FILES(A) ;FILES PTR. ON FILE CONSIDERING GENTXT'ING
CAMN B,[-1] ;-1 INDICATES LAST FILES ENTRY PAST
JRST PUT1 ;WE RAN OUT OF FILES TO LIST, **'S PLS
PUSHJ P,GENTXT ;CHEW ENGLISH OUT TO BP7
SKIPE ZERO ;DEBUG CHECK TO SEE IF DIRLIN WAS MORE THAN FILLED
JRST [ TRNN F,%TTY ;HERE WHEN BUFFER FULL, TTY?
JRST 4,. ;NOP
OUTSTR DIRLIN ;HERE WHEN OUR BUFFER FULL
SETZM DIRLIN
MOVE B,[DIRLIN,,DIRLIN+1]
BLT B,DIRLIN+DIRLEN-1
MOVE B,[440700,,DIRLIN] ;GENTXT WANTS BP SET UP FOR IT
MOVEM B,BP7
JRST .+1
]
AOBJN A,PUTL1
MOVE B,FILES(A) ;THIS IS NEXT FILE OFF THE BOTTOM OF SCREEN
CAME B,[-1] ;IF EXISTS SHOW --'S TO INDICATE MORE, ELSE
SKIPA C,RSTRIPE ;THERE IS ANOTHER FILE OFF THE BOT OF SCREEN
PUT1: MOVE C,RSTARS ;NO FILES OUT THERE
TRNE F,%TTY ;DIRECT IF ON TTY
JRST TVRLSG
SGEN @C
PUSHJ P,MSKO ;PUMP OUT THESE **'S OR --'S AND FILE MASK
PUTDP: SGEN @C
SUB A,[1,,1] ;MAKE AOBJN POINTER THAT MUCH MORE FRIENDLY
SPRINT 8,[-36] ;AT LEAST ON CRLF, WITHOUT THE SPACES
JRST .+2 ;WE MAY NOT WANT ANY SPACES AT ALL, ASK AOBJN PTR. FIRST
SGEN [ASCIZ /
/] ;∞ SPACES, CRLF. FLUSH TEXT ON CURRENT LINE, MOVE TO NEXT
TRNN F,%GETTY ;ON III PRINT ONLY 1
AOBJN A,.-2 ;PRINT AT LEAST ONE CRLF
TRNE F,%GETTY
JRST PUTIII ;III DON'T THINK DD CAN HACK IT PHYLS.
DDUPG [200000,,DDHEAD↔DIRLEN+3↔0↔DDMUNG]
PUTXIT: RECALL D↔RECALL C↔RECALL B↔RECALL A
POPJ P,
PUTIII: AOS A,BP7 ;THIS GOT THE LOCATION WE WERE WRITING TEXT INTO LAST
SUBI A,IIHEAD ;
HRRZM A,IIIBLK+1 ;THIS IS WHERE LENGTH OF PRG KEPT
DPYOUT IIIBLK
PGACT (<SETZ>)
PGSEL
JRST PUTXIT
IIIBLK: IIHEAD ;POINTS AT PROG
0 ;LENGTH GETS SET UP
STARS: [ASCIZ /************************/]
STRIPE: [ASCIZ /------------------------/]
RSTARS: [ASCIZ /******* /]
RSTRIP: [ASCIZ /------- /]
TVRLSG: OUTSTR DIRLIN ;PUMP OUT ALL THAT %"&!
EXIT
MSKO: PUSH P,A ↔ PUSH P,B
MOVEI A, ;A IS IDX TO MMASK
SGEN [ASCIZ /File Mask = /]
MOVEM A,MSKFOO#
MSKO0: CAIN A,6
JRST MSKO1
SKIPGE MMASK(A)
AOJA A,MSKO0
MOVE A,MSKFOO
MOVE B,MMASK(A)
CAIGE B, ;- MEANS WE'VE GOT AN ANYBODY'S
SKIPA B,["∀"]
ADDI B,40
IDPB B,BP7
AOJA A,MSKO0-1
MSKO1: SKIPGE MMASK-1(A) ;MORE CHRS?
SGEN [ASCIZ /*/]
SGEN [ASCIZ / /]
MOVEM A,MSKFOO
MSKO5: CAIN A,9
JRST MSKO6
SKIPGE MMASK(A)
AOJA A,MSKO5
MOVE A,MSKFOO
MOVE B,MMASK(A)
CAIGE B,
SKIPA B,["∀"]
ADDI B,40
IDPB B,BP7
AOJA A,MSKO5-1
MSKO6: SKIPGE MMASK-1(A)
SGEN [ASCIZ /*/]
SGEN [ASCIZ / /]
POP P,B ↔ POP P,A ↔ POPJ P,
PUTDL: ;GET HERE TO DISPLAY DELETE LIST
MOVEI A,1 ;BLT DIRLIN TO 1'S FOR DD
MOVEM A,DIRLIN
MOVE A,[DIRLIN,,DIRLIN+1]
BLT A,DIRLIN+DIRLEN-1
MOVE A,[440700,,DIRLIN]
MOVEM A,BP7
;PUT UP HEADER LINE FOR DELETE LIST MODE
SGEN [ASCIZ /......PPN = /]
TYPE6 6,LUSER ;CRANK OUT THE 6 SIXBIT CHRS IN LUSER TO BP7 (ASCII)
SGEN [ASCIZ / ....... Total /]
TYPE6 4,LOSS0 ;THE DEVICE NAME
TRNE F,%FAST
JRST PUTDL1 ;IN FAST MODE WE DONT KNOW ABOUT WORDS
SGEN [ASCIZ / Space in Words = /]
MOVE A,WORDS
TRNN F,%KMODE ;PRINT DSK WORD SIZEZ ≥ 1000 IN K'S?
JRST .+3 ;SKIP OVER KMODE STUFF
CAIL A,=1024 ;IF GREATER OR = TO 1000 PRINT AS 69 K, NOT 69000
JRST [ IDIVI A,=1024
SPRINT =10,A
SGEN [ASCIZ /./]
SPRINT =10,B
SGEN [ASCIZ / K /]
JRST PUTDL1]
SPRINT =10,A ;OTHERWISE JUST PRINT AS WORDS
PUTDL1: SGEN [ASCIZ / ......
Filename Ext P PN
/]↔ SKIPE DIPFIL ;IF WE ARE AT TOP (0) USE **'S
SKIPA A,STRIPE ;USE 'EM ----'S
MOVE A,STARS
SGEN @A
SPRINT 8,[-36] ;CRLF
MOVE A,DIPFIL ;THIS IS WHERE WE SHOULD START DISPLAYING FROM IN THE LIST
HRLI A,-NLINES ;AOBJN ON PRODUCE ING TEXT
PUTD1: MOVE B,DELIS0(A);SO GET WINNING FIRST FILE NAME OF THIS DELETE LIST FROB
JUMPE B,PUTD2 ;WE'RE SURE THRU, NO MORE CRUFTIES BEFORE RAN OUT OF SCREEN
TYPE6 6,B ;PRINT THE FILE NAME FOR THE GUY
SGEN [ASCIZ / /] ;A LITTLE SPACE BETWEEN FILE NAMES
TYPE6 3,DELIS1(A) ;THIS IS THE EXT, ONLY 3 CHRS
SGEN [ASCIZ / /]
TYPE6 6,DELIS2(A) ;WHAT COULD BE EASIER, THE PPN
SPRINT 8,[-36] ;CRLF
AOBJN A,PUTD1
MOVE B,DELIS0(A) ;SEE IF THERE IS ANOTHER FILE OUT THERE OFF THE
;BOT OF SCREEN SIZE
CAIE B,
SKIPA C,RSTRIP ;THERE'S ANOTHER GUY OUT THERE, USE ---'S
PUTD2: MOVE C,RSTARS
SGEN @C
SGEN [ASCIZ /Delete list Mode /]
JRST PUTDP ;NOW PUT THIS TRASH UP
COMMENT ⊗ Initialization ⊗
GETSET: INIT UFDC,10
LOSS0: SIXBIT /DSK/
UFDNUL
JRST FATL02 ;CAN'T INIT?
INIT FILC,410 ;400 BIT FOR LONG LOOKUPS
LOSS1: SIXBIT /DSK/
FILNUL
JRST FATL02
INIT FIL,16
LOSS2: SIXBIT /DSK/
0
JRST FATL02
INIT MFDC,10
LOSS3: SIXBIT /DSK/
MFDNUL
JRST FATL02
comment ⊗
DPYINI: GETLIN A ;TELL LUSER HE IS LUSING IFF NOT DISPLAY
TLNN A,20000!400000 ;SKIP IF DD OR III
JRST FATL07 ;NOT DISPLAY
TLNE A,(<SETZ>) ;direct IF III, skip IF DD
TROA F,%GETTY ;ONE MEANS III
TRZ F,%GETTY ;0 IS DD
⊗
dpyini: TRNE F,%TTY ;SKIP IF ON DISPLAY
POPJ P,
PPSEL 2
DPYSIZ 4*1000+1
TRNN F,%GETTY ;DIRECT ON DD
DPYPOS -1000+14*=9
TRNE F,%GETTY
DPYPOS -1000+=24*4
PPACT 100000
TRNN F,%GETTY ;III WANTS LITTLE MORE HELP GETTING STARTED
POPJ P,
PGSEL ;MAKES UPG MOVES WORK
PGACT (<SETZ>) ;DISPLAYS POG 0
SETZM DDHEAD ;SYSTEM III STUFF GETS CONFUSED BY DD PROGRAM
SETZM DDMUNG
POPJ P,
COMMENT ⊗ Read UFD and produce FILES table ⊗
REAUFD: SETOM FILES ;FILL FILES WITH -1'S TO INDICATE UNFILLED CELLS
MOVE A,[FILES,,FILES+1]
BLT A,FILES+NFILES-1
SETOM LUKDAT ;FILL LOOKDAT WITH -1 SO UUO CAN FAIL IF FILE IS NX
MOVE A,[LUKDAT,,LUKDAT+1]
BLT A,LUKDAT+NFILES*7-1
MOVE A,[[' 1 1' ↔ 'UFD ' ↔ 0 ↔ ' 1 1'],,UFDIN]
BLT A,UFDIN+3
LOOKUP MFDC,UFDIN ;OPEN 1,1
ERR 0,<I can't find the MFD.>
MOVSI I,-NFILES
;FOR SINGULAR PPNS DONT READ THE ENTIRE MFD
MOVE A,[440600,,LUSER] ;GO THRU LUSER LOOKING FOR ?'S
REPEAT 6,<
ILDB B,A ;GET A CHARACTER OF THE PPN TYPED BY LUSER
CAIN B,'?' ;BREAK OUT OF THIS REPEAT AND DO THE NORMAL THING
JRST REA10 ;IF THERE ARE ANY ?'S
>
MOVE II,LUSER ;WE GET HERE IF LUSER HAS NO ?S IN PPN, FAKE IT
USETI MFDC,377777 ;WAY OFF THE END OF THE MFD...
JRST REASNG
REA10: GET MFDC,II ;THIS HERE FIRST WORD SHOULD BE A UFD NAME
JRST REASIZ ;WIN! NO MORE UFD'S
GET MFDC,B ;BUT MAKE SURE THE EXT IS REALLY "UFD"
JRST 4,.
TRZ B,-1 ;TURN OFF THIS GARBAGE. WE CONSERNED WITH EXT NAME
CAME B,['UFD '] ;DIRECT IF THIS ISNT EVEN A UFD
JRST [ EXCH A,FLCTXX# ↔ MOVEI A,=14 ↔ EXCH A,FLCTXX
GET MFDC, ↔ JRST 4,. ;NOT A UFD, FLUSH RECORD
SOSLE FLCTXX ↔ JRST $.-3
JRST REA10]
EXCH A,FLCTXX ↔ MOVEI A,=13 ↔ EXCH A,FLCTXX
GET MFDC, ↔ JRST 4,.
SOSLE FLCTXX ↔ JRST .-3 ;TAKE THE 3rd-15th WORDS OF RECORD AWAY. THE
;16th WILL BE COLLECTED BY REASNG, DOUBLING AS A TEST FOR NON SINGULAR PPNs
;IN WHICH CASE, DON'T TYPE 'Reading UFD' MESSAGE.
PUSHJ P,REAMAT ;SKIP RETURN IF WE HAVE A MATCH TO 'LUSER'
JRST [GET MFDC,↔JRST 4,. ↔ JRST REA10]
;WILL HAVE TO COLLECT 16th WORD FOR REASNG, AND TRY ANOTHER UFD REC.
;FALL THROUGH TO REASNG, WE HAVE A MATCH
REASNG: SETZM WORDS
SETOM RLUKOK
MOVEM II,UFDB ;FOR FIRST FILE NAME, OPEING THE UFD
MOVSI A,'UFD'
MOVEM A,UFDB+1 ;FOR SECOND FILE NAME
MOVE A,[21,,21] ;PPN OF [1,1]
MOVEM A,UFDB+3
LOOKUP UFDC,UFDB ;TRY TO GET THIS USERS UFD OPEN
JRST [ GET MFDC, ;IGNORE THIS UFD, FLUSH 16TH WD IN MFD ENTRY
JRST REA10
JRST REA10 ]
GET MFDC, ;COLLECT THE 16TH WORD, AND DECIDE IF WE SHOULD
CAIA ;PRINT 'Reading UFD' MESS
JRST READ1 ;OR NOT.
OUTSTR [ASCIZ /
Reading UFD for user /]
PUSHJ P,PRWHO ;PRINT LUSER ON TTY
OUTSTR [ASCIZ / - /]
;II HAS THE PPN WE DEALING WITH, GOT IT FROM MFD. I IS THE AOBJN AC
READ1:
MOVEI C, ;FIND FREE SPACE IN LUKDAT
read1b: MOVE D,LUKDAT(C)
CAME D,[-1]
CAIN D,
JRST READ1A ;FREE
ADDI C,7
JRST READ1B
READ1A:
movem c,lukpt
GET UFDC,B ;GET WORD INTO B, WHICH SHOULD BE THE FIRST FILE NAME
JRST REA10 ;NON SKIP MEANS EOF HAS BEEN READED ON THIS UFD, NO MORE
; FILES IN THIS UFD, GO ONE READING MFD FOR ANOTHER UF
movem b,ufdibf
GET UFDC,C ;GET THE EXT,
JRST 4,. ;SHOULD NOT EOF IN MIDDLE OF UFD ENTRY
movem c,ufdibf+1
get ufdc,ufdibf+2;word (2)
jrst 4,.
get ufdc,ufdibf+3 ;throw away
jrst 4,.
get ufdc,ufdibf+3 ↔ jrst 4,.
movns ufdibf+3
movss ufdibf+3
get ufdc,ufdibf+4 ↔ jrst 4,. ;throw away 5
get ufdc,ufdibf+4 ↔ jrst 4,.
get ufdc,ufdibf+5 ↔ jrst 4,.
get ufdc, ↔ jrst 4,.
get ufdc, ↔ jrst 4,.
get ufdc, ↔ jrst 4,.
get ufdc, ↔ jrst 4,.
get ufdc, ↔ jrst 4,.
get ufdc,WRITER(I) ↔ jrst 4,.
get ufdc,WRITES(I) ↔ jrst 4,.
get ufdc, ↔ jrst 4,.
JUMPE B,READ1 ;ZERO FILE NAME MEANS THIS ENTRY IN UFD NOT USED
CAMN B,[-1] ;-1 FILE NAME IS OK WITH SYSTEM, BUT NOT WITH DIRED
JRST READ1 ;IGNORE IT THEN
MOVEM B,UFD(I) ;PUT THE FIRST FILE NAME IN THE UFD TABLE
MOVEM C,UFD2(I) ;PUT THE EXT,,CREATION DATE
MOVEM II,LLUSER(I) ;AND KEEP PPNS PARR
PUSHJ P,CMASK ;CHECK MASK, SKIP RETURN IF THIS FILE SHOULD BE ALLOWED IN UFD
JRST READ1 ;THIS FILE IS MASKED OUT, GET THE NEXT UFD ENTRY
HRR B,I ;PUT THE UFD ENTRY NUMBER IN RIGHT HALF
MOVEM B,FILES(I);STUFF IN FILES, PERHAPS TO BE SORTED LATER
camn ii,[' 1 1'] ;MFD doesnt have new ufd format
jrst read1l
push p,c ↔ push p,b
movsi c,ufdibf
hrr c,lukpt
addi c,lukdat
move b,lukpt
blt c,lukdat+5(b)
movem ii,lukdat+6(b)
pop p,b ↔ pop p,c
READ1L: AOBJN I,READ1
OUTSTR [ASCIZ /
I don't have enough room for all those files.
I stopped reading at /]
TTY6 6,UFD-1(I) ;-1 BECAUSE DID AOBJN
OUTCHR ["."]
TTY6 3,UFD2-1(I)
OUTSTR [ASCIZ / in [/]
TTY6 6,II ;THE PPN SHOULD STILL BE THERE
OUTSTR [ASCIZ /] - /]
;FALL THRU TO REASIZ AS IF MFD'S END HAD BEEN REACHED
REASIZ: ;GET HERE WHEN DONE READING UFD. CAUSE ALL THE FILES TO BE LOOKED UP, AND
;GET WORD COUNT ON ALL FILES
TRNE F,%FAST ;DIRECT IF IN FAST MODE
JRST [ MOVE A,I ;RETURN EXPECTS TO FIND OLD AOBJN AC IN A
POPJ P, ;DONT DO ANY LOOKUP STUFF
]
; OUTSTR [ASCIZ /Reading Lookup Data - /]
SETZM WORDS ;COUNT OF WORDS IN FILE
SETZM FULWHO ;WE ARE LOOKING UP ALL, MIGHT AS WELL INDICATE THEY ARE ALL
MOVE A,[FULWHO,,FULWHO+1] ;LOOKED UP..
BLT A,FULWHO+NFILES-1
SETOM ANYWHO ;INDICATE AT LEAST ON FILE HAS BEEN LOOKED UP [SOON..]
MOVSI A,-NFILES ;AOBJN AC
MOVEI D, ;LOW ORDER BIT OF D IS LOOKED AT, CLEARED WHEN TESTED.
;CONSIDER ALL THE FILES IN ORDER FOUND IN FILES (AOBJN AC IS FILES IDX)
REA1: MOVE B,FILES(A) ;SETS B UP WITH INDX INTO UFD TABLES
CAME B,[-1] ;-1 IN FILES INDICATES WE HAVE HIT THE END
JRST CPOPJ+1
REALEA: CLOSE UFDC, ;CLOSE OUT IO
CLOSE MFDC,
CLOSE FILC,
CPOPJ: POPJ P,
MOVE C,UFD(B) ;GET THE FIRST FILE NAME
MOVEM C,UFDIN ;PUTS IT IN LOOKUP BLOCK
MOVE C,UFD2(B) ;GET THE EXT
MOVEM C,UFDIN+1 ;FOR LOOKUP
MOVE C,LLUSER(B);GET THE PPN
MOVEM C,UFDIN+3
FLOOKUP ;DO THE RIGHT THING
TROA D,1 ;SO WE WILL JRST (NOT AOBJN) WHEN WE LOOP NEXT TIME
JRST .+2 ;SKIPA
REMOVE 1,A ;CANT LOOKUP FILE, PROTECT ERROR. REMOVE IT FROM FILES TAB
MOVS E,UFDIN+3 ;GET NEG SWAPED WORD COUNT (SWAP IT)
MOVN E,E
ADDM E,WORDS ;BUMP WORD COUNT UP BY THAT
HRLM E,FILES(A) ;HIDE THE WORD COUNT FOR FILES IN LEFT HALF OF FILES WORDS
MOVE E,UFDIN+2 ;THIS HAS LOW 12. OF DATE, AND TIME
DPB E,[271400,,E] ;PUT THE DATE ABOVE THE TIME
LSH E,-=12 ;MAKE ROOM FOR 3 BITS, AND FLUSH 12 MOVED BITS OF DATE OFF END
LDB C,[170300,,UFDIN+1] ;THIS IS WHERE "DATE 75" HIGH ORDER 3 BITS OF DATE ARE
DPB C,[270300,,E] ;STICK THE HIGH 3 BITS OF DATE WHERE THEY BELONG
MOVEM E,DATES(B)
TRZE D,1 ;THIS GETS SET IF WE SHOULD NOT AOS A
JRST REA1 ;THE FILES TABLE HAS BEEN SHUFFLED SO THAT WE ARE NOW
;POINTING AT THE NEXT ENTRY WITHOUT HAVING TO AOS IDX
AOBJN A,REA1 ;AGAIN.
MOVE B,FILES(A)
CAME B,[-1] ;THIS BETTER -1 OFF THE END OF FILES TABLE
ERR 0,<Inconsistancy in FILES, there seem to be more files than room in table.>
JRST REALEA ;OK, LEAVE AFTER CLOSING ALL THE CHANS
CMASK: PUSH P,A ↔ PUSH P,B ↔ PUSH P,C ↔ PUSH P,D
;SKIP IF THE FILE IN B & C IS LIKED BY CURRENT MASK
MOVE A,[440600,,B] ;CHECK THESE CHARACTERS AGAINST THE MASK
FOR ZZ←0,8,1 <
IBP A
SKIPGE MMASK+ZZ ;NEG MEANS MATCH ANY CHARACTER
JRST .+4
LDB D,A ;GET A CHARACTER
CAME D,MMASK+ZZ ;MUST MATCH EX.
JRST CMOUT ;THIS FILE LOSES
>
POP P,D ↔ POP P,C ↔ POP P,B ↔ POP P,A
AOS (P)
POPJ P,
CMOUT: POP P,D ↔ POP P,C ↔ POP P,B ↔ POP P,A
POPJ P,
REAMAT: ;SKIP RETURN IF PPN IN II FALLS WITHIN MASK SPECFIED BY LUSER
PUSH P,A ↔ PUSH P,B ↔ PUSH P,C ↔ PUSH P,D
MOVE A,[440600,,II] ;BP INTO THE PPN BEING CHECKED
MOVE B,[440600,,LUSER]
REPEAT 6,<
ILDB C,B
ILDB D,A ;C HAS MASK CHR, D HAS TEST PPN
CAIN C,(D) ;DIRECT IF THESE GUYS LIKE EACH OTHER
JRST .+3
CAIE C,'?' ;SKIP IF WE ARE SUPPOSED TO TAKE THIS ANYWAY (?)
JRST REAMTE ;A REAL HONEST LUSER!
>
AOS -4(P) ;SKIP RETURN
REAMTE: POP P,D ↔ POP P,C ↔ POP P,B ↔ POP P,A
POPJ P,
ufdibf: block 6
lukpt: 0
COMMENT ⊗ Line Editing ⊗
;PUT DIRECTORY LINE IN LINE EDITOR. AFTER USER EDIT, READ IT INTO RENAME BLOCK
;AND RENAME THE FILE(ACCORDING TO TTY EDIT).
LINE: TRNN F,%DEBUG ;SKIP IF WE ARE GOING TO LET THIS HAPPEN
JRST RIHANG
MOVEI A,1 ;SET DIRLIN TO 1
MOVEM A,DIRLIN
MOVE A,[DIRLIN,,DIRLIN+1]
BLT A,DIRLIN+DIRLEN-1
MOVE A,[440700,,DIRLIN] ;BYTE POINTER FOR GENTXT
MOVEM A,BP7
MOVE A,CURFIL
PUSHJ P,GENTXT
PTLOAD [0 ↔ DIRLIN]
;IN THE MEAN TIME, PREPARE BLOCKS FOR RENAME
MOVE B,FILES(A) ;THIS GETS US A UFD INDEX
MOVE C,UFD(B) ;THIS GETS US FIRST FILE NAME OF FILE HACKING
MOVEM C,UFDIN ;WE ARE GOING TO DO A FLOOKUP ON THIS FILE TO GET ALL THE
MOVE C,UFD2(B) ; OLD DATA FOUND IN A LOOKUP ON THIS FILE
MOVEM C,UFDIN+1 ;SECOND FILE NAME
MOVE C,LLUSER(B);PPN
MOVEM C,UFDIN+3
LOOKUP FILC,UFDIN;OPEN THIS FILE FOR RENAME
JRST 4,. ;HMM, WHERE DID IT GO?
MOVE B,[UFDIN,,RENBLK] ;NOW SET UP RENAME BLOCK WITH OLD DATA
BLT B,RENBLK+5 ;IN CASE WE DON'T MODIFY ALL OF IT
ACTCHR A, ;WAIT TILL HE IS THRU WITH THIS LINE
;PROCESS THE EDITED LINE COMMING IN ON THE TTY
CAIN A,175 ;DID HE TERMINATE WITH AN ALT?
POPJ P, ;GIVE UP
NRSYCL←←0
DEFINE RSYLAB ! (SYLAB,BREAK,BRKSET)
<
;<BRKSET 0 ==> BREAK ON SPACE, CR
NRSYCL←←NRSYCL+1
JRST [ MOVE SYLAB,[440600,,SYLAB] ;THIS WILL BE THE BP FOR SYLAB WE READING
MOVEM SYLAB,SYBP6Z# ;WE WILL BE OPERATING OUT OF STOCKHOLM
MOVEI SYLAB,
CONC(RSYC,\NRSYCL): INCHRS BREAK, ;GET A CHARACTER FROM THE SYLAB
SKIPA BREAK,[15] ;THE ACTCHR UUO STOLE THE CR FROM E-O-L
FOR ZZZ E {BRKSET} ;JRST .+1 IF THIS IS ANY OF THE BREAK CHAR
<CAIN BREAK,"ZZZ" ;DIRECT IF THIS IS AN OFFICAL BREAK CHAR
JRST .+1 ;RETURN FROM CONSTANTINOPLE
>;FOR BRKSET
CAIL BREAK,"`" ;DIRECT IF LOWER CASE ASCII
SUBI BREAK,100 ;MAKE UPPER CASE OUT OF IT
SUBI BREAK,40 ;AND THEN MAKE SIXBIT OUT OF IT
IDPB BREAK,SYBP6Z ;GET OUTA HERE
JRST CONC(RSYC,\NRSYCL) ;NOTHER GO AT IT (NEXT CHR)
];JRST
>;DEFINE RSYLAB
RSYLAB (A,B,. ) ;GET THE TTYs IDEA OF A FIRST FILE NAME
PUSHJ P,EATBRK
MOVEM A,RENBLK ;PUT IT IN THE RENAME BLOCK
RSYLAB (A,B, [) ;GIVE A EXT
PUSHJ P,EATBRK
HLLZM A,RENBLK+1 ;PUT THE EXT IN RENAME BLOCK
RSYLAB (A,B,<,] >) ;GET PPN,BE PREPARED FOR [105,SGK] STYLE TOO
CAIN B,"," ;DIRECT IF [105,SGK] STYLE PPN, AND WE HAVE LEFT .5
JRST [ HLLM A,RENBLK+3;THE LEFT HALF OF THE PPN
MOVEI A, ;FIND OUT WHAT TO DO WITH RIGHT HALF INCASE USER...
DSKPPN A, ;DOESNT SAY
HRRM A,RENBLK+3 ;IF THERE IS A <,SGK> USE IT INSTEAD, LATER
]
CAIN B,"]" ;DIRECT IF END OF [105] STYLE PPN, PROBABLY
JRST [ MOVEM A,RENBLK+3;SAVE PPN.
;IF [105SGK] STYLE, LEAVE IT BE. IF [105] STYLE, FILL RIGHT HALF
;WITH SAME OF ORIGINAL FILE
TRNE A,-1 ;SKIP IF [105] STYLE
JRST LINE1 ;PPN ALL DONE. MAY I HAVE THE NEXT SLIDE
MOVE A,CURFIL ;GET THE PPN FOR THE CURRENT FILE
MOVE A,FILES(A) ;GET THE UFD POINTER FOR THIS FILE
MOVE A,LLUSER(A) ;AND FINALLY, GET THE PPN
HRRM A,RENBLK+3 ;USE SAME RIGHT HALF OF PPN AS ORG FILE
JRST LINE1
];JRST
LINE1: ;CONTINUE READING LINE, IGNORE SIZE, GET DATE
RSYLAB (A,B, ) ;EAT THE FILE SIZE
PUSHJ P,EATBRK ;SHOULD BE RIGHT UP AGAINST 26-Nov-74
CLRBFI ;THATS IT FOR NOW
LINE2: ;DONE READING LINE, DO RENAME AND MODIFY INTERNAL DATA ON FILE
RENAME FILC,RENBLK ;DO IT
ERR 0,<Rename Fails>
LOOKUP FILC,RENBLK ;NOW RE LOOK IT UP TO GET NEW DATA
FLOOKUP ;FIND OLD FILE'S DATA, LEAVE POINTER IN FLKDAT
EATBRK: PUSH P,A
ETBRK1: SNEAKS A,
JRST CPOPJ1 ;NO CHARACTERS, FLUSH ANYWAY
CAIE A,"[" ;EAT [ AND ]s TOO
CAIN A,"]"
JRST EATIT
CAIL A,"1" ;SKIP IF TO BE EATEN
JRST CPOPJ1 ;STOP EATING CHARCTERS WITH THIS ONE, RETURN
EATIT: INCHRW A ;WASTE IT
JRST ETBRK1 ; AND CONTINUE LOOKING FOR
COMMENT ⊗ Produce english for line editor ⊗
LINTXT: PUSH P,A ↔ PUSH P,B ↔ PUSH P,C
...
COMMENT ⊗ Produce english of of file pointed to by A in DIRLIN ⊗
GENTXT: SAVE A↔SAVE B↔SAVE C↔SAVE D
MOVE A,FILES(A) ;GET UFD INDEX OF THIS FILE FROM FILES
MOVEM A,GENPT ;OUR GUY
SKIPE FULWHO(A) ;SKIP IF THIS FILE WANTS TO BE DISPLAYED IN FULL
TLZA A,1 ;USE 1,, TO INDICATE TO DO LOOKUP
TLO A,1
MOVE B,UFD(A) ;GET FIRST FILE NAME OF THIS FILE FROM UFD TABLE
MOVE C,UFD2(A) ;AND THE 2.ND
MOVE D,LLUSER(A) ;THE PPN
MOVEM B,UFDIN ;FOR LOOKUP
MOVEM C,UFDIN+1
MOVEM D,UFDIN+3
TLNN A,1 ;IN FAST MODE DONT DO LOOKUPS [FOR THIS FILE] [HIDE BIT HERE]
JRST .+3
FLOOKUP FILC,UFDIN ;GET LONG FORM LOOKUP DATA IN UFDIN (USER UUO)
JRST 4,.
TYPE6 6,B ;TYPE FIRST FILE NAME
SGEN [ASCIZ / /]
TYPE6 3,C ;TYPE FILE NAME 2
SGEN [ASCIZ / /]
TYPE6 6,D ;TYPE PPN
SGEN [ASCIZ / /] ;ONE BIG FAT JUICY TAB
TLNN A,1 ;NO OTHER INFORMATION AVAILABLE IF IN FAST MODE
JRST GENTEX
MOVS A,UFDIN+3 ;GET -SWAP WD. CNT (I THOUGHT THERE WAS A J IN JUICE)
MOVNS A ;NEGATE IT
SETZM CCT ;ZERO CHR. COUNT FOR TABING OUT
PUSHJ P,SIZSPC ;PRINT A NUMBER OF SPACES TO RIGHT ADJUST SIZE.
TRNN F,%KMODE ;SKIP IF WE ARE IN KMODE (69000 PRINTS AS 69 K)
JRST .+3
CAIL A,=1024 ;GREATER THAN K?
JRST [ IDIVI A,=1024
SPRINT =10,A
SGEN [ASCIZ / K/]
AOS CCT
JRST GENT6]
SPRINT =10,A ;CRANK OUT CHRS TO BP7
GENT6: SGEN [ASCIZ / /]
HRRZ A,UFDIN+2 ;7777 CONTAINS DATE, HIGH 3 IN HIGH 3 OF RT OF +1
LDB C,[170300,,UFDIN+1] ;GET THE HIDDEN HIGH 3 BITS
DPB C,[140600,,A] ;PUT THEM WITH REST OF DATE BITS
IDIVI A,=31
ADDI B,1 ;REMAINDER IS DAY-1
CAIGE B,=10 ;IF LESS THAN 10 TYPE A SPACE TO FORCE IT TO TAKE 2 POS.
SGEN [ASCIZ / /];LIKE I SAID, NUMBER ONE DIGIT, TAKE 2 POSITIONS
SPRINT =10,B ;CRANK DAY OUT
IDIVI A,=12
XCT MONTHS(B) ;UUO WILL PRINT NAME OF MONTH
ADDI A,=64 ;OR 1964 FOR FULL YEAR NUMBER,,,,
SPRINT =10,A ;GUESS
SGEN [ASCIZ/ /];BLOOD IS THICKER THAN PRUNE JUICE
LDB A,[141300,,UFDIN+2] ;TIME WRITTEN
IDIVI A,=60 ;CHOMP IT UP INTO HOURS AND MINS.
MOVE C,B ;HOLD THESE MINS. FOR A MIN..
IDIVI A,=10 ;GIVE ME TWO DIGITS OF LOSSAGE
SPRINT =10,A ;THIS HAS ONE DIGIT OF HOUR
SPRINT =10,B ;AND HERE IS THE OTHER
IDIVI C,=10 ;NOW BREAK MINS INTO TWO DIGITS TO INSIST ON LEADING 0
SPRINT =10,C ;C HAS HIGH ORDER MIN
SPRINT =10,D
COMMENT ⊗ REMOVED BEACUSE OF %DEVUO HACK (USE SPRINT UUO INSTEAD
ADDI A,"0"↔ADDI B,"0"
IDPB A,BP7↔IDPB B,BP7
IDIVI C,=10 ;TAKE MINS APART INTO TWO DIGITS
ADDI C,"0"↔ADDI D,"0"
IDPB C,BP7↔IDPB D,BP7
⊗
SGEN [ASCIZ/ /];TAB
MOVE A,[440300,,UFDIN+2] ;BP FOR PRO
REPEAT 3,{ILDB B,A ;GET NUMBER
ADDI B,60
TRNE F,%DEVUO ;DIRECT IF THE DEVICE FLAG IS ON
JSR B,.TAKE ;IN WHICH CASE USE THIS TO OUTPUT TO DEVICE (SKIP RETURN)
IDPB B,BP7}
SGEN [ASCIZ / /]
MOVE A,GENPT ;IDX
TYPE6 6,WRITES(A) ;LAST WRITER OF FILE INSTEAD OF DUMP INFO
SGEN [ASCIZ / /]
TYPE6 6,WRITER(A)
SGEN [ASCIZ / /]
MOVEI A,77777 ;THESE ARE THE DATE BITS IN THIS WORD.. (REF DATE)
AND A,UFDIN+4
IDIVI A,=31
ADDI B,1
CAIGE B,=10
SGEN [ASCIZ / /]
SPRINT =10,B
IDIVI A,=12
XCT MONTHS(B)
ADDI A,=64
SPRINT =10,A
MOVE A,UFDIN+5 ;GET THE DUMP INFORMATION WORD
TLNN A,20000 ;SKIP IF THIS DUMP INFO IS INVALID
JRST GENT7 ;NO, ITS OK NOW PRINT IT
; SGEN [ASCIZ / /] ;PRINT SPACES INSTEAD OF DUMP INFO
JRST GENT9
GENT7: SGEN [ASCIZ / /]
MOVEI A,77777 ;THESE ARE THE BITS FOR THE DATE, IN SYS FORMAT
AND A,UFDIN+5 ;GET THEM
CAIN A, ;IF THIS IS ZERO, NO DATE
JRST [;SGEN [ASCIZ / /] ;FILE NOT DUMPED
JRST GENT9]
COMMENT ⊗ NO MORE DUMP DATE
IDIVI A,=31
ADDI B,1
CAIGE B,=10 ;WE GOING TO GET ONE OR TWO DIGITS OUT OF THIS?
SGEN [ASCIZ / /] ;ONE
SPRINT =10,B ;LETS HERE IT, THIS IS THE DAY
IDIVI A,=12 ;NOW SQUEEZE THE MONTH OUT OF THIS
XCT MONTHS(B)
ADDI A,=64 ;GIVES US RANDOM YEAR, ADD 1964 FOR 4 DIGIT YEAR NUMBER
SPRINT =10,A
⊗
SKIPGE UFDIN+5 ;SIGN BIT IS PERM/TEMP BIT
JRST [ SGEN [ASCIZ /T/]
JRST GENT9
]
SGEN [ASCIZ /P /]
LDB A,[400300,,UFDIN+5] ;GET THE NUMBER OR PERM DUMPS
SPRINT =10,A
GENT9:
GENTEX: SPRINT 8,[-36] ;CRLF
RECALL D↔RECALL C↔RECALL B↔RECALL A
POPJ P,
SIZSPC: ;CRANK OUT ENOUGH SPACES
PUSH P,A↔PUSH P,B
TRNN F,%KMODE ;SKIP IF SIZES ≥ 1000 SHOULD BE PRINTED IN K
JRST .+3
CAIL A,=1024 ;TURN THIS FIGURE INTO K WDS?
JRST [ IDIVI A,=1024
MOVEI B,
SUBI B,2
JRST SIZSP1] ;WHEN K'ING " K" TAKES 2 POSITIONS
MOVEI B, ;B IS NUMBER OF SPACES TO TYPE AFTER THIS COMP
SIZSP1: CAIGE A,=10 ;ADD ONE TO B FOR EACH CHR. POSITION NOT PRINTED BY SPRINT
ADDI B,1
CAIGE A,=100
ADDI B,1
CAIGE A,=1000
ADDI B,1
CAIGE A,=10000
ADDI B,1
CAIGE A,=100000
ADDI B,1
JUMPL B,FATL05 ;NUMBER SOOPER MOBY (LIKE ≥ 10000 K ! )
FAL05R:SIZLOP: SOJL B,SIZEND ;PRINT B SPACES TO ADJUST RIGHT NUMBER
SGEN [ASCIZ / /]
JRST SIZLOP
SIZEND: POP P,B↔POP P,A↔POPJ P,
GENPT: 0 ;GETS IDX OF OUR FILE
COMMENT ⊗ Sort the files ⊗
SORT: SAVE A↔SAVE B↔SAVE C↔SAVE D
MOVEI A, ;POINTER TO UPPER FILES CONSIDERING
TRNN F,%ORDER ;SKIP IF SHOULD BE REVERSE SORTING
SKIPA I,ZERO ;INS. THAT CARE WILL XCT IDX OF THIS
MOVEI I,1 ; ""
SORTL: MOVE B,FILES(A) ;GET FIRST OF THEM
MOVE C,FILES+1(A) ;AND 2ND
CAME B,[-1] ;WE RUNNING INTO END OF FILES?
CAMN C,[-1]
JRST SORTE ;YES, LETS FLUSH
JRST ABCSKP ;DO THE DIRTY WORK. COMPARE DATES OR FILENAMES OR NATURAL JUICES
SORTE: POP P,D↔POP P,C↔POP P,B↔POP P,A
POPJ P,
;SKIP COMMENTS APPLY TO FOWARD SORT (I CONTAINS 0)
ABCSKP: TRNE F,%SZSRTS ;SKIP IF WE ARE NOT TO SORT BY SIZE
JRST [ HLRZ D,B;B CONTIANS THE FILES WORD, WHOSE LEFT HALF IS THE FILE SIZE
HLRZ E,C;C CONTIANS THE SECOND FILES WORD...
JRST ABCGO ;DO ALL THAT THERE SKIP STUFF
]
TRNE F,%SORT
JRST ABCDAT
TRNN F,%XTSRT ;SKIP IF WE ARE TO SORT BY EXTENTION BEFORE FILE NAME
SKIPA D,UFD(B) ;GET FFNAM OF FIRST FILE
HLLZ D,UFD2(B) ;THE LOW HALF IS GARBAGE
TLC D,400000 ;THEY ARE SIXBIT, TO BE SORTED
TRNN F,%XTSRT ;DIRECT IF EXTENSION IS TO BE MORE SIGNIFICANT THAN FILE NM
SKIPA E,UFD(C) ;GET FFNAME OF SECOND FILE
HLLZ E,UFD2(C)
TLC E,400000
JRST ABCGO
ABCDAT: MOVE D,DATES(B) ;GET DATES FOR FIRST AND SECOND FILE
MOVE E,DATES(C)
ABCGO: XCT [CAMG D,E ↔ CAML D,E](I) ;SKIP IF THESE TWO ARE OUT OF ORDER
JRST ABC1
SWAP: MOVEM B,FILES+1(A) ;PUT THEM BACK SWITCHED
MOVEM C,FILES(A)
CAIE A,
SOJA A,SORTL ;AFTER SWITCHING FILES, SEE IF NEEDS TO BE DONE AGAIN
AOJA A,SORTL ; ALREADY GOT THIS GUY TO THE TOP, CAN'T MOVE HIM UP AGAIN..
ABC1: TRNN F,%SZSRTS ;SKIP IF WE ARE SORTING BY SIZE
TRNE F,%SORT ;ONLY IF WE ARE IN FILENAME MODE...
AOJA A,SORTL ;(OTHERWISE LOOP)
CAME D,E ;IF THEY ARE EQUAL WILL HAVE TO LOOK AT EXTENSIONS
AOJA A,SORTL ;NO, THEY DON'T NEED TO BE SWAPPED, NEXT PAIR
TRNE F,%XTSRT ;DIRECT FOR SORT BY EXT. (GET FILENAME HERE, LOW ORDER WD.)
SKIPA D,UFD(B)
MOVE D,UFD2(B) ;GET 2FNAME OF FIRST FILE
TLC D,400000
TRNE F,%XTSRT
SKIPA E,UFD(C)
MOVE E,UFD2(C) ;GET 2FNAME OF SECOND FILE
TLC E,400000
XCT [CAMG D,E ↔ CAMLE D,E](I) ;SKIP IF TOP IS GREATER, MEANS NEED TO SWAP THEM
AOJA A,SORTL ;OH WELL, THEY DONT NEED TO BE SWAPPED
JRST SWAP
COMMENT ⊗ Switch Code ⊗
RDONLY: TROE F,%READONLY;GO INTO READONLY MODE, SKIP IF WE MUST REDISPLAY
JRST RIHANG
TRNN F,%START
JRST RIHANG
JRST FCYCLE
READW: TRZN F,%READONLY;GO INTO READWRITE MODE, SKIP IF WE MUST RE DISPLAY
JRST RIHANG
TRNN F,%START
JRST RIHANG
JRST FCYCLE
LKPCF: ;THE /LOOKUP SWITCH, FOR GETTING FULL DISPLAY ON FILES
TRNN F,%START ;DIRECT IF WE GETTING THIS FROM MONITOR COMMAND LINE
JRST RIHANG ;I DONT HAVE TO TAKE THAT FROM YOU
SETOM ANYWHO ;INDICATE TO WORLD THAT AT LEAST ON FILES HAS BEEN LOOKED UP
MOVE A,CURFIL ;HERE WE HAVE IT, THE CURRENT FILE'S NUMBER
MOVE A,FILES(A) ;CURFIL IS FILES IDX. FILES WORDS HAVE UFD IDX...
SETZM FULWHO(A) ;0 MEANS THIS FILE IS IN FULL MODE, THIS WILL 'LOOK IT UP'
SWGARD FCYCLE ;OKAY...
SZSRTS: ;PROCESS THE /SIZE SORT SWITCH
TRO F,%SZSRT ;TURN ON THE SORT BY SIZE BIT
SWGARD SCYCLE ;A GARDEN FOR FRESH NATURAL SWITCHES FOR YOU DINING PLEASURE
FFASTM: TRO F,%FAST
;ANY CHANGE IN THE MTHD. FOR ENTERING FAST MODE MUST BE REFLECTED AT GO
SETZM ANYWHO ;THIS MEANS THERE ARE NO FULL FILES IN THE ENTIRE WORLD! [THEY AINT HARD TO CONVINCE]
SETOM FULWHO ;TELL WORLD ALL FILES ARE IN FAST MODE, ALTHOUGH THAT MAY BE A LIE
MOVE A,[FULWHO,,FULWHO+1]
BLT A,FULWHO+NFILES-1
SWGARD FCYCLE
FFULM: TRZN F,%FAST ;GO INTO FULL MODE, DIRECT IF WE WERE IN FAST MODE BEFORE
JRST RIHANG
TRNN F,%START ;DIRECT IF WE READING MONITOR COMMAND LINE
JRST RIHANG
PUSH P,[SCYCLE] ;RETURN TO OCYCLE THERE
JRST REASIZ ;THIS IS A PART OF READ UFD WHICH DOES ALL THE LOOKUPS
SHOWU: TRC F,%DDELS ;CHANGE DISPLAY MORE, DELETE LIST, OR FILES
TRNN F,%START ;DO THE STANDARD THING
JRST RIHANG
TRNE F,%DDELS ;SKIP IF WE HAVE JUST RETURNED FROM DELETE LIST MODE
JRST SHW1
PUT CURFIL,CURFIS ;SET UP CURFIL WITH OLD VALUE
PUT DIPFIL,DIPFIS
MOVE A,TFILES ;HERE IS WHERE WE HID TFILE WHEN WE GOT INTO THIS MODE
MOVEM A,TFILE
SUBI A,1
MOVEM A,TFILE1
JRST SHWE
SHW1: PUT CURFIS,CURFIL ;SAVE SCREEN INFORMATION WE NOW HAVE
SETZM CURFIL ;AND GO TO TOP FOR SHOWING DELETE LIST
PUT DIPFIS,DIPFIL
SETZM DIPFIL
PUT TFILES,TFILE
MOVEI A, ;FIND OUT THE HIGHEST IDX INTO DELETE LIST
SKIPE DELIS0(A)
AOJA A,.-1
MOVEM A,TFILE1
ADDI A,1
MOVEM A,TFILE ;SAVE IT SO DISPLAY FROBERS WONT OVERSHOOT
SHWE: TRNN F,%RRUFD ;MUSTH RE-READ UFD FLAG
JRST FCYCLE
JRST RCYCLE
EXTSRT: TRZ F,%SZSRTS ;ITS JUST ABOUT TIME THAT YOU GOT OVER YOU SIZE HANGUP
TRZN F,%SORT ;SET SORT BY ALPHA
TRCA F,%XTSRT ;SO WE WILL SORT BY EXT FIRST WHEN 1
TRO F,%XTSRT ;GET HERE IF SORT WAS BY DATE WHEN THIS COMMAND TYPED
; AND INSIST ON EXT. SORT, NOT COMPLEMENT
TRNN F,%START ;DIRECT IF THIS IS FROM A COMMAND LINE
JRST RIHANG
TRO F,%NOOK ;DONT BOTHER USER WITH "OK" MESS
TRNN F,%RRUFD;UNLESS ...
JRST SCYCLE ;AND CYCLE THRU FROM SORT
JRST RCYCLE ;WE HAVE TO DO WIDE CYCLE
KMODC: TRC F,%KMODE ;CHANGE THE KMODE
TRO F,%NOOK ;DON'T BOTHER THE USER WITH AN OK FOR THIS
TRNN F,%START ;DIRECT IF THIS IS COMMING FROM A COMMAND LINE
JRST RIHANG
TRNE F,%RRUFD ;IF WE GOT HERE AFTER TAKING A FILE NAME
JRST RCYCLE ;THEN WE CANT FORGET TO RE READ THE UFD
PUSHJ P,PUTUP ;THIS IS NONKJ-STANDARD, BUT IT PREVENTS ARROW FROM
JRST OCYCLE ;BEING RE-DRAWN FOR NO GOOD REASON
RVSRT: TRC F,%ORDER ;CHANGE ORDER FILES SORTED IN
TRNN F,%START ;DIRECT IF TAKING SWITCHES FROM COMMAND LINE
JRST RIHANG ;GET SOME MORE
TRNN F,%RRUFD ;IF WE HAVE REC. A FILE NAME MUST RCYCLE
JRST SCYCLE ;RE-SORT AND DISPLAY
JRST RCYCLE
UDPMOD: TROA F,%UDP ;SET UDP BIT
DSKMOD: TRZA F,%UDP
SKIPA A,['UDP '] ;PUT THE NEW DEVICE NAME IN A
MOVSI A,'DSK'
;THIS MESS PUTS THIS DEVICE NAME IN THE INITS' DEVICE WORDS
ZZZ←←0
FOR @! ZZ←0,9,1 < ;CLOBBER ALL THE LOSS!# 'S (NO .ISTOP! IN LOSING FAIL)
IFE ZZZ,< ;IF THE LAST GUY WE HACKED WAS DEFINED
IFDEF LOSS!ZZ,< ;AND THIS NEXT GUY EXISTS
MOVEM C,LOSS!ZZ ;SAVE THIS AWAY
> ;IFDEF THIS GUY
IFNDEF LOSS!ZZ,< ;HAVE WE HIT THE END OF THE LINE
ZZZ←←1 ;YEP, MAKE THE REST OF THIS FLY BY FASTER
> ;IFNDEF
> ;IFE ZZZ
> ;LOSING FOR
TRNN F,%START ;SKIP IF THIS IS A MONIT. COM. LINE SWITCH
JRST RIHANG ;CHECK THIS OUT
JRST RCYCLE
RUNDEL: ;RUN DELETE LIST
TRNN F,%START ;ARE WE REALLY RUNNING, OR IS THIS A SWITCH
JRST RIHANG ;FOO, YOU CANT TYPE THIS AS A SWITCH
PUSHJ P,XITING
TRNE F,%RRUFD ;DO WE HAVE TO DO WIDE CYCLE? DIRECT IF T
JRST RCYCLE
TRNE F,%DDELS ;DIRECT IF IN DELETE LIST MODE
JRST FCYCLE ;WILL HAVE TO PUT UP NEW DISPLAY
JRST OCYCLE
DEBGM: TRO F,%DEBUG ;PUT US IN DEBUG MODE
TRNN F,%RRUFD ;WERE WE SUPPOSED TO GET ANOTHER PPN OR DEVICE
JRST RIHANG
JRST RCYCLE ;YEP
ABORT: SETZM ARGSGN ;ALL WE NEED TO DO IS SIMULATE A -∞ DELETE
SETOM ARGF
MOVEI A,NFILES ;WE REGARD NFILES AS INF.
MOVEM A,ARG ;YOU PUT OUR NATIONAL BIRD IN THE OVEN?
JRST UNDEL ;I BET I FORGET TO CHANGED THIS REF TO UNDEL IF I HAVE TO
;CHANGE UNDEL
DATESR: TRZ F,%SZSRTS ;TV-36
TRO F,%SORT ;SET SORT BY DATE FLAG
TRNN F,%START
JRST RIHANG
TRNN F,%RRUFD
JRST SCYCLE
JRST RCYCLE
; INSKIP ;ARE THERE ANY CHRS LEFT TO BE DECODED?
; TRNE F,%START
; JRST RIHANG
; JRST RCYCLE
ALPHAS: TRZ F,%SZSRTS ;SIZE AIN'T EVERYTHING
TRZ F,%SORT ;SET SORT BY ALPHA
TRZ F,%XTSRT ;RESET EXTENSION SORT SWITCH
TRNE F,%START
JRST SCYCLE
TRNN F,%RRUFD
JRST RIHANG
JRST RCYCLE
; INSKIP
; TRNE F,%START
; JRST RIHANG
; JRST RCYCLE
COMMENT ⊗ Print a bit of this file ⊗
PRIFIL: DPYPOS 1000-<4*14.>
DPYSIZ <4*1000+<NLINES+2>/4>>
...
COMMENT ⊗ Read PPN ⊗
RPPN: SETZM CURFIL
SETZM DIPFIL
SETZM CURFIS
SETZM DIPFIS
MOVE A,LUSER
SETZM RPPNF#
RRPPN: MOVE B,[440600,,SYLAB]
RPPN2: SETZM PPNCCT
RPPN2A: INCHWL C
CAIN A,"∀"
MOVEI A,"?"
CAIN C,","
JRST RPPN1
CAIN C,"*"
JRST RPPN5
CAIN C,12
JRST RPPN2
CAIE C,"["
CAIN C," "
JRST RPPN2
CAIE C,"/"
CAIN C,"]"
; JRST RPPN3 ;WE NOW EXIT (AT COMMAND LINE LEVEL) TO SETMASK, WHO REMOVES LF
JRST [SNEAKW C, ↔ CAIE C,15 ↔ JRST RPPN3 ↔ INCHRW ↔ JRST RPPN3 ]
;CONDITIONALY TAKE THE CHR FOLLOWING A "]" OUT OF THE INPUT BUFFER CR→YES, ELSE NO
CAIN C,15
JRST RPPN3
CAIL C,141
CAILE C,172
XORI C,40
IDPB C,B
AOS PPNCCT
JRST RPPN2A
RPPN5: CAMN B,[220600,,SYLAB]
JRST RPPN2A
MOVEI C,'?'
IDPB C,B
AOS PPNCCT
JRST RPPN5
RPPN1: MOVE C,PPNCCT↔MOVE D,SYLAB
RPPN12: CAIL C,3
JRST RPPN11
lSH D,-6
AOJA C,RPPN12
RPPN11: HLL A,D
SETOM RPPNF#↔JRST RRPPN
RPPN3: MOVE C,PPNCCT↔MOVE D,SYLAB
RPPN31: CAIL C,3
JRST RPPN32
LSH D,-6
AOJA C,RPPN31
RPPN32: SKIPN RPPNF#
JRST [HLL A,D↔JRST RPPN33]
HLR A,D
RPPN33: TRNN F,%START ;DIRECT IF WE ARE READING A MONIT. COMMAND LINE
JRST RPPN34 ;SAVE NEW PPN AND WIN
RPPN34: MOVEM A,LUSER ;NOW SAVE NEW LUSER
TRNN F,%START ;AND FIGURE OUT HOW TO GET OUT OF HERE
JRST RIHANG ;THIS WAS FROM MONITOR COMMAND LINE, TOP LEVEL NOS WHT TO DO
TRO F,%RRUFD
JRST RCYCLE
PPNCCT: 0↔SYLAB:BLOCK 2
COMMENT ⊗ Read a Mask ⊗
SETMAS: ;READ FROM TTY TO SET MASK
TRO F,%RRUFD ;SO EXIT CRUD (SWITCH, ETC ) WILL RE READ UFD
SETOM MMASK ;DEFAULT MASK TO MATCH ANY FILE
MOVE A,[MMASK,,MMASK+1]
BLT A,MMASK+8
TRNE F,%START ;SKIP IF THIS IS COMMING FROM MONIT COMMAND LINE
OUTSTR [ASCIZ / Mask: /]
SETZM CURFIL ;SET ALL DISPLAY PARAMS TO BE LOOKING AT THE TOP
SETZM DIPFIL
SETZM CURFIS ;THESE ARE THE HIDDEN OLD DIP PARAMS
SETZM DIPFIS ;FOR %DDELS MODE
MOVEI B, ;THIS WILL BE USED AS IDX TO MUNG MMASK
MASKL: INCHWL A
CAIE A,"/" ;ARE WE REALLY READY TO READ A SWITCH
CAIN A,"[" ;OR IS THIS AN AREA NAME?
JRST MASFLS ;WELL, TELL THE WORLD..
CAIN A,":" ;DEVICE NAME
JRST MASDEV ;OOPS! WE'VE BEEN TAKING A DEVICE NAME AS A MASK
CAIN A,12 ;LF MEANS RPPN STOLE CR FROM BUFFER, NO MORE TO DO
JRST RCYCLE
CAIN A,15 ;CR MEANS WE ARE COMPLETELY THRU READING COMMAND LINE
JRST MASFLS ;SO LET TOP LEVEL GET US STARTED AFTER THE LF
CAIN A,"*" ;MEANS FILL OUT THIS FILE NAME WITH 'MATCH ANY CHR'S'
JRST MASK1
CAIN A,"." ;MEANS MOVE ON TO NEXT FILE, FILL OUT TO END WITH SPACES.
JRST MASK2
CAIN A,"↓" ;THIS GUY! QUOTE THESE
JRST MASK3
CAIE A,"∀" ;MATCH ANY CHR
CAIN A,"?" ;MATCH ANY CHR
JRST MASK4
CAIN A," " ;DONT LISTEN
JRST MASKL
CAIN B,9 ;IF WE HAVE ALREADY WRITTEN UP TO END OF MASK
JRST MASKL ;FORGET ABOUT EXTRA CHRS
CAIGE A,140 ;MAKE SIXBIT OUT OF THIS
XORI A,40
TRZ A,777700 ;TURN THEM OFF IN CASE IT WAS LOWER CASE
MOVEM A,MMASK(B) ;WHO WAS THAT MAN?
AOJA B,MASKL
MASFLS: CAIN B, ;IS THE MASK COMPLETELY VIRGIN
JRST MASF1 ;YEP, NOW GO TO RPPN, SWITCH, OR RIHANG
MASF0: CAIN B,9 ;OK, A MASK SET, NOW WIPE TO END WITH SPACES THEN FLS
JRST MASF1
SETZM MMASK(B)
AOJA B,MASF0
MASF1: CAIN A,"/" ;AH HA! A SWITCH IAS BOTHERING US
JRST SWITCH
CAIN A,"["
JRST RPPN
CAIE A,15
JRST MASHUH ;HUH? WHAT BROUGHT US HERE
TRNN F,%START ;DIRECT IF WE ARE READING A COMMAND LINE
JRST RIHANG ;CR, NOW READ UFD AND ET...
JRST RCYCLE ;RE-READ UFD
MASHUH: PUSHJ P,CLEAR ;THIS IS FUNNY
OUTSTR [ASCIZ /
Funny, I can't figure out why I was called. Yours Truly, MASKed READER
/]↔ OUTCHR A ;OUTPUT THE CHR
exit
MASK1: CAIN B,6 ;IF WE ARE AT END OF FIRST FILE WHEN WE COME IN HERE
JRST .+4 ; IT MEANS FILL OUT SECOND FILE NAME
MASK10: CAIE B,6 ;ARE WE ALREADY AT END OF FIRST, OR SECOND FILE
CAIN B,9
JRST MASKL
SETOM MMASK(B) ;CLOBBER THIS ONE TO MATCH ANY CHR
AOJA B,MASK10
MASK2: CAIE B,6 ;MAKE REST OF CHRS IN THIS FILE NAME SPACES
CAIN B,9
JRST MASKL ;MADE IT
SETZM MMASK(B) ;ZERO IS SPACE
AOJA B,MASK2
MASK3: INCHSL A ;READ SOME QUOTED CHARACTERS
ERR 0,<No characters in buffer in ↓'s while reading mask.>
CAIN A,"↓"
JRST MASKL ;GLAD THAT'S OVER
CAIE A,"∀" ;THIS MEANS SAME AS ?, BUT IS NOT SIXBIT SO CAN BE
JRST MASK31
SETOM MMASK(B) ; USED IN QUOTES
AOJA B,MASK3
MASK31: CAIGE A,140
XORI A,40
TRZ A,777700 ;TURN OFF THIS CRAP INCASE IT WAS LOWER CASE
MOVEM A,MMASK(B) ;YUM
AOJA B,MASK3
MASK4: SETOM MMASK(B) ;THIS WAS A "?"
AOJA B,MASKL
MASDEV: ;GET HERE WHEN A : IS TYPED WHILE READING A MASK, TAKE CHR OUT OF MASK TO
;GETSET'S DEVICE FROBS
PUSH P,A ↔ PUSH P,C ↔ PUSH P,D
MOVSI A,-6
MOVEI C,
MOVE B,[440600,,C] ;ASSEMBLE DEVICE NAME IN C
MASDVL: MOVE D,MMASK(A) ;GET A CHR WHICH SHOULD HAVE GONE TO DEVICE NAME
CAIGE D, ;SKIP IF THIS LOOKS LIKE A REAL CHR
JRST MASDV1
IDPB D,B ;STUFF IT IN C
AOBJN A,MASDVL
ZZZ←←0 ;LOSING FAIL. HERE'S WHERE ALL THE TIME IS GOING
MASDV1: FOR @! ZZ←0,9,1 < ;CLOBBER ALL THE LOSS!# 'S (NO .ISTOP! IN LOSING FAIL)
IFE ZZZ,< ;IF THE LAST GUY WE HACKED WAS DEFINED
IFDEF LOSS!ZZ,< ;AND THIS NEXT GUY EXISTS
MOVEM C,LOSS!ZZ ;SAVE THIS AWAY
> ;IFDEF THIS GUY
IFNDEF LOSS!ZZ,< ;HAVE WE HIT THE END OF THE LINE
ZZZ←←1 ;YEP, MAKE THE REST OF THIS FLY BY FASTER
> ;IFNDEF
> ;IFE ZZZ
> ;LOSING FOR
CAMN C,['UDP ']
TROA F,%UDP ;DO THE RIGHT THING IF HE WENT TO UDP
TRZ F,%UDP
SETOM MMASK ;NOW RESET MASK TO BE VIRGIN TERRA
MOVE A,[MMASK,,MMASK+1]
BLT A,MMASK+8
TRNE F,%START ;IF WE ARE GETTING THIS DEVICE NAME FROM COMMAND LINE THEN
JRST MASDV2
MOVEI A, ;0 TO DSKPPN MEANS RETURN OWN
DSKPPN A, ; DON'T USE THE PPN FROM TEMPCORE, BUT THE LUSERS DSKPPN
MOVEM A,LUSER ;BUT IF DEVICE GIVEN WHILE RUNNING, HE PROBABLY WANT PPN
MASDV2: POP P,D ↔ POP P,C ↔ POP P,A
MOVEI B,
JRST MASKL
COMMENT ⊗ Output Text to Random Device ⊗
OUTDT: PUSHJ P,OUTDTI ;INITIALIZE
PUSHJ P,OUTDTH ;OUTPUT HEADER
PUSHJ P,OUTDTB ;OUTPUT BODY
JRST OCYCLE
OUTDTA: ;FOONLY MODE, OUTPUT FILE NAMES WITH NO HEADERS
PUSHJ P,OUTDTI ;INITIALIZE
PUSHJ P,OUTDTF ;OUTPUT FOONLY MODE BODY
JRST OCYCLE
OUTDTI: INCHSL
JFCL ;GET THE LF OUT OF INPUT BUFFER
GETFIL (E,Output File Name :,0,FIL,DELBLK,7,OUTDT) ;GARBAGES AC'S
TRO F,%DEVUO ;SO TEXT UUO'S IN GENTXT WILL OUTPUT TO FIL CHAN
POPJ P,
OUTDTH: SGEN [ASCIZ /...... PPN = /]
TYPE6 6,LUSER
TRNE F,%FAST ;IN FAST MODE DONT TYPE DIRECTORY SIZE
JRST OUTDT3
SGEN [ASCIZ / ....... Total /]
TYPE6 6,LOSS0 ;THIS IS THE DEVICE NAME BEING EDITED ON
SGEN [ASCIZ /Space used in words = /]
SPRINT =10,WORDS
OUTDT3: SGEN [ASCIZ / ......./]
SPRINT 8,[-36]
SKIPN ANYWHO ;DIRECT IF THERE ARE NO FULL MODE FILES
; TRNE F,%FAST ;USE HEDLI2 WHEN IN FAST MODE
SGEN @HEDLI2
SKIPE ANYWHO ;DIRECT IF THERE IS AT LEAST ON FAST MODE FILE
; TRNN F,%FAST ;USE NORMAL HEAD LINE OTHERWISE
SGEN @HEDLIN ;HERE IS A SGEN WITH THE HEADER INFO "FILENAME EXT...
POPJ P,
OUTDTB: MOVSI A,-NFILES ;AOBJN THRU FILE LIST GEN. TEXT OF FILES TO DEVICE
OUTDT1: MOVE B,FILES(A) ;THIS IS THE FILE
CAMN B,[-1] ;AS SOON AS WE FIND A -1 WE HAVE HIT E/O FILES LIST.
JRST OUTDT2
PUSHJ P,GENTXT ;GENTXT TAKES A TO BE INDX INTO FILES, NOT CLOBBERED
AOBJN A,OUTDT1 ;RUN THAT BY ME AGAIN?
OUTDT2: SPRINT 8,[-36]
CLOSE FIL,
TRZ F,%DEVUO
POPJ P,
OUTDTF: ;OUTPUT FOONLY MODE BODY
MOVSI A,-NFILES ;AOBJN THRU FILE LIST, OUTPUTING FILE NAMES
OUTDF1: MOVE B,FILES(A) ;THIS IS THE FILE
CAMN B,[-1] ;-1 IS EO FILE LIST
JRST OUTDF2
PUSHJ P,GENNAM ;OUTPUT TO DEVICE A MACHINE READABLE FILE NAME
SPRINT 8,[-36]
AOBJN A,OUTDF1
OUTDF2: CLOSE FIL,
TRZ F,%DEVUO
POPJ P,
GENNAM: ;GIVEN A INDEX INTO FILES LIST OUTPUT MACHINE READABLE FILE NAME
PUSH P,A ↔ PUSH P,B
MOVE B,FILES(A) ;GET UFD INDEX FOR THIS FILE
MOVE A,UFD(B) ;GET FIRST FILE NAME
PUSHJ P,GEN6B ;OUTPUT IT
HLLZ A,UFD2(B) ;PICK UP EXT OF THIS FILE
JUMPE A,GENNA1 ;DONT BOTHER WITH ".EXT" IF NONE EXISTS
SGEN [ASCIZ /./];. BETWEEN FILE.EXT
PUSHJ P,GEN6B ;OUTPUT EXT OF THIS FILE
GENNA1: SGEN [ASCIZ /[/]
HLLZ A,LLUSER(B);GET PROJECT NAME
PUSHJ P,GEN6P
SGEN [ASCIZ /,/]
HRLZ A,LLUSER(B)
PUSHJ P,GEN6P
SGEN [ASCIZ /]/]
POP P,B ↔ POP P,A ↔ POPJ P,
GEN6P: PUSH P,A ↔ PUSH P,B ↔ PUSH P,C
MOVE C,[440600,,A] ;SIXBIT BYTE POINTER INTO PROJECT OR PROGRAMMER NAME
REPEAT 3,<
ILDB B,C ;GET A CHAR
JUMPE B,.+3
ROT B,-6 ;PLACE THIS SIXBIT CHAR IN CORRECT PLACE
TYPE6 1,B
>;REPEAT 3
POP P,C ↔ POP P,B ↔ POP P,A ↔ POPJ P,
GEN6B: PUSH P,A ↔ PUSH P,B ↔ PUSH P,C
MOVE C,[440600,,A]
REPEAT 6,<
ILDB B,C ;GET A CHAR
JUMPE B,GEN6B1 ;SPACE INDICATES END OF ROAD
ROT B,-6
TYPE6 1,B
>;REPEAT 6
GEN6B1: POP P,C ↔ POP P,B ↔ POP P,A ↔ POPJ P,
COMMENT ⊗ Files Spooled Here. No cost, no obligation ⊗
SPOOLR: ;THIS GETS CALLED AS A SWITCH, SPOOL ARG FILES
MOVE Q,[-QPDS,,QPDL-1]
TRNN F,%START ;DIRECT RETURN IF THE LUSER TYPED THIS IN COMMAND LINE
JRST RIHANG
ARGET A,1,CJRST4 ;GET THE ARG
MOVSI A,(A) ;USE ARG AS AOBJN COUNT
HRR A,CURFIL ;GET THE FILES INDEX TO START FROM IN RIGHT
SPOOLL: MOVE B,FILES(A) ;THIS GIVES THE UFD INX FOR THE CURRENT FILE
CAMN B,[-1] ;DIRECT IF WE HAVE HIT THE BOTTOM OF THE BAR.
JRST SPOLLE
MOVE D,UFD(B) ;THIS HERE SHOULD BE THE FIRST FILE NAME TO SPOOL
MOVEM D,SPLBLK ;FOR SPOOLM
HLLZ D,UFD2(B) ;THE LEFT HALF IS THE EXT
MOVEM D,SPLBLK+1
MOVE D,LLUSER(B) ;GET THE PPN OF THIS FILE
MOVEM D,SPLBLK+3
EXTERN SPOOLM,SPL%CN
PUSHJ Q,SPOOLM
JUMP SPLBLK ;I GUESS SPOOLM LOOKS HERE FOR THE ADDS.
AOBJN A,SPOOLL ;GO DO THIS FOR MORE LUSER FILES
SPOLLE: SWGARDEN RIHANG ;QREWPOUI
COMMENT ⊗
For FAIL and Macro programs the calling sequence is:
EXTERN SPOOLM,SPL%CN
PUSHJ 17,SPOOLM
JUMP ARGS
where ARGS is the address of a four word lookup block that has the
appropriate flags in the right half of ARGS+1. The IO channel that is
used may be selected by setting the external variable SPL%CN to some
number which will be used (mod 20 octal) as the channel number to
use. The default is channel 17. The address of ARGS may be anywhere
in your core, except that if you use the accumulators for ARGS, then
ARGS must be smaller than 14 so that all four words will fit beneath
17. As a programming convenience, all accumulators will be restored
by this routine to their original values.
All programs:
The flags have the following significance:
Octal Bit Meaning
1 (bit 35) delete this file after listing
2 (bit 34) do fortran carriage control
4 (bit 33) use LPT mode 101 instead of mode 1.
10 (bit 32) delete SOS line numbers
20 (bit 31) print headings at the top of each page
40 (bit 30) suppress the title page.
100 (bit 29) make narrow title page for 8.5" paper
200 (bit 28) list data as octal words.
400 (bit 27) suppress message announcing "spooling done"
1000 (bit 26) convert all line feeds to '177&'21.
⊗
COMMENT ⊗ FNR for /OUTPUT command ⊗
;READ FILE SPECS FROM TTY INTO BLOCK
;WORD AFTER CALL IS DEFAULT EXTENSION,,BLK ADDRESS.
;DOESNT SKIP IF ALT MODE TYPED.
;SKIPS ONCE IF SYNTAX ERROR, TWICE IF OK.
FILSCN: MOVE L,@(P)
HLLZM L,1(L) ;SET UP DEFAULT EXTENSION
AOS (P)
MOVE I,SAVPPN
MOVEM I,3(L) ;INITIALIZE TO CURRENT DSK PPN
PUSHJ P,GETSIX ;SYMBOL IN J, SEPARATOR IN I
CAIN I,175 ;ALT MODE
POPJ P,
AOS (P)
MOVEM J,(L)
CAIN I,"."
JRST FILSCX ;GET EXTENSION
CAIN I,"["
JRST FILSCP ;GET PPN
CAIN I,12
POPJ1: AOS (P)
POPJ P,
FILSCX: PUSHJ P,GETSIX
HLLZM J,1(L)
CAIN I,12
JRST POPJ1
CAIE I,"["
POPJ P,
FILSCP: PUSHJ P,GETSIX
JUMPE J,FILSP3
FILSP1: TLNE J,77 ;RIGHT ADJUST
JRST FILSP2
LSH J,-6
JRST FILSP1
FILSP2: HLLM J,3(L) ;STORE PROJ NUMBER
FILSP3: CAIN I,","
JRST FILSP4 ;GET PROGRAMMER NAME
FILSP8: CAIN I,"]"
JRST FILSP5 ;DONE
CAIN I,12
AOS (P)
POPJ P,
FILSP4: PUSHJ P,GETSIX
JUMPE J,FILSP8
FILSP6: TLNE J,77
JRST FILSP7
LSH J,-6
JRST FILSP6
FILSP7: HLRM J,3(L)
JRST FILSP8
FILSP5: PUSHJ P,GETSIX
CAIN I,12
JRST POPJ1
JRST FILSP5
LUPFL: OUTSTR [ASCIZ /LOOKUP FAILED - /]
MOVEI L,LUP
FILNOU: MOVE I,(L)
PUSHJ P,SIXTYP
OUTCHR ["."]
MOVE I,1(L)
PUSHJ P,SIXTY3
OUTCHR ["["]
MOVE I,3(L)
PUSHJ P,SIXTY3
OUTCHR [","]
MOVS I,3(L)
PUSHJ P,SIXTY3
OUTSTR [ASCIZ /]
/]
POPJ P,
ENTFL: OUTSTR [ASCIZ /ENTER FAILED - /]
MOVEI L,ENT
JRST FILNOU
;GET SIXBIT SYLLABLE IN J WITH SEPARATOR IN I
GETSIX: MOVE K,[440600,,J]
MOVEI J,0
GETSX1: INCHWL I
CAIN I,15
JRST GETSX1
CAIL I,"0"
CAILE I,"9"
JRST GETSX2 ;NOT NUM
JRST GETSX3 ;NUMBER
GETSX2: CAIL I,"a"
CAILE I,"z"
JRST GETSX4 ;NOT LOWER CASE
JRST [ SUBI I,40 ;LOWER CASE
JRST GETSX3]
GETSX4: CAIL I,"A"
CAILE I,"Z"
POPJ P,
GETSX3: SUBI I,40
TLNE K,770000
IDPB I,K
JRST GETSX1
;TYPE I IN SIXBIT (6 CHARS WORTH)
SIXTYP: MOVE J,[440600,,I]
SIXTY1: ILDB K,J
ADDI K,40
OUTCHR K
TLNE J,770000
JRST SIXTY1
POPJ P,
;TYPE LEFT 3 CHARS OF I
SIXTY3: MOVE J,[440600,,I]
SIXTY4: ILDB K,J
ADDI K,40
OUTCHR K
TLNE J,500000
JRST SIXTY4
POPJ P,
INITL: OUTSTR [ASCIZ /CAN'T INIT DSK - LOSEY, LOSEY
/]
JRST 4,.
SAVPPN: 0 ;HAS CURRENT DSK PPN
LUP: BLOCK 4
ENT: BLOCK 4
COMMENT ⊗ Trivia ⊗
RSCAN: ;READ MONITOR COMMAND LINE, AND DO ALL THE RIGHT THINGS WITH IT
PUSH P,A
RESCAN
RSCAN1: INCHRW A ;KEEP READING UNTIL FIRST CHR
CAIL A,"A" ;THROW OUT NON A-Z AND a-z's
CAILE A,"Z"
JRST .+2 ;MAY BE a-z
JRST RSCAN2 ;WE'VE GOT A 'WINNER'
CAIL A,"a"
CAILE A,"z"
JRST RSCAN1
SUBI A,40 ;MAKE THIS LOWER CASE `WINNER' INTO SOMETHING WE CAN UNDERSTAND
RSCAN2: CAIN A,"D" ;IF THE FIRST CHR IS A "D" THEN WE ARE READING A 'DRD' COMMAND
JRST RSCAN3 ;THIS MEANS THE FIRST NON A-Z a-z CHR IS WHERE TO STOP
;WHEREAS THIS MEANS ; IS WHERE TO STOP
RSCAN4: INCHRW A
CAIE A,";"
CAIN A,15 ;OR A CR MEANS NO GARBAGE OF INTEREST, ANYWAY
JRST RSCANE ;POPJ AND WHATNOT
JRST RSCAN4 ;OH WELL, THERES ONE OUT THERE SOMEWHERE
RSCAN3: SNEAKW A,
CAIL A,"A" ;SO THROW THESE OUT
CAILE A,"Z"
JRST .+2
JRST [ INCHRW ;THROW THIS OUT
JRST RSCAN3]
CAIL A,"a"
CAILE A,"z"
JRST RSCNE2 ;YUM! THIS GUY THIS NOT A LETTER
INCHRW ;THROW OUT THIS A-Z CHR
JRST RSCAN3 ;AND GET ANOTHER LUSER
RSCNE2: CAIE A,"/" ;FLUSH THE BREAK CHR UNLESS IT IS /[*
CAIN A,"["
JRST RSCANE
CAIE A,"*"
INCHRW ;THROW THIS OUT
;AND FALL THRU TO RSCANE
RSCANE: ;IF THERE IS ANYTHING ACTUALLY IN THE COMMAND LINE (OTHER THAN DRD ETC.)
;THEN FLUSH CURFIL, DIPFIL, AND PPN.
SNEAKW A, ;WE MAY FIND A LF OR CR HERE, OR SOME OTHER LOSSAGE
CAIE A,12 ;LF
CAIN A,15 ;OR CR?
JRST [ POP P,A ;YEP, WELL, LEAVE IT TO BEAVER
POPJ P,
]
SETZM CURFIL
SETZM DIPFIL ;DO IN THESE TWO OLD FROBS
MOVEI A,
DSKPPN A, ;NOW FIND OUT WHAT THE GUY'S ALIAS IS
MOVEM A,LUSER ;AND CLOBBER LUSER. WE DOING THIS BECAUSE COMMANDS
;ARE BEING GIVEN IN MONIT LINE. WE DONT CLOBBER THE FLAGS
SETOM MMASK ;NOW BLT *.* TO MASK
MOVE A,[MMASK,,MMASK+1]
BLT A,MMASK+8
POP P,A
POPJ P,
PRWHO: PUSH P,A↔PUSH P,B
MOVE A,[440600,,II] ;READ CHRS FROM LUSER LOC
REPEAT 6,{ILDB B,A↔ADDI B,40↔OUTCHR B}
POP P,B↔POP P,A
POPJ P,
ZCLEAR: TRNE F,%TTY ;CLEAR IS A NOOP ON TTYS
POPJ P,
TRNE F,%GETTY ;ON III
JRST [ PGACT ↔ POPJ P,] ;ON III
SETOM DDSELP ;LET ↓↓ (THAT DOWN THERE) KNOW NOT TO CLEAR ECHO LINES
CLEAR: TRNE F,%TTY ;DIRECT ON TTYS
POPJ P,
TRNE F,%GETTY ;ON III ONLY A ...
JRST [ SETZM DDSELP ↔ DPYCLR ↔ POPJ P, ] ;IS NEEDED
PUSH P,A↔PUSH P,B ↔ PUSH P,BP7
DDUPG [200000,,DDFLSA↔5↔0↔DDFMUN] ;FLUSH OLD ARROW
MOVEI A,1
MOVEM A,DIRLIN
MOVE A,[DIRLIN,,DIRLIN+1]
BLT A,DIRLIN+DIRLEN-1
MOVE A,[440700,,DIRLIN]
MOVEM A,BP7
SKIPN DDSELP ;THROUGH IN A FEW MORE FOR CLEARING ECHO LINES
SKIPA A,[-<NLINES+4+5>,,]
MOVSI A,-<NLINES+4>
CLEAR1: sgen [asciz /
/]↔ AOBJN A,CLEAR1
; DDUPG [200000,,DDHEAD↔DIRLEN+3↔0↔DDMUNG]
DDUPG DDCLR
SKIPE DDSELP
JRST .+3
PPSEL
PPSEL 2
CLEAR2: SETZM DDSELP
POP P,BP7 ↔ POP P,B↔POP P,A
POPJ P,
DDCLR: 200000,,DDHEAD
DIRLEN+3
0
DDMUNG
COMMENT ⊗ Temp core
TMPCOR file looks like
PPN
CURFIL,,DIPFIL
MMASK ;FOOBAR
MMASK
MMASK
MMASK
MMASK
MMASK ;.
MMASK ;BAZ
MMASK
MMASK
FLAGS
DEVICE ;FROM LOSS0
⊗
NTPCW←←=13 ;NUMBER OF TEMP CORE WORDS NEEDED
WTMPC: PUSH P,A ↔ PUSH P,B
MOVEI A,
TMPCOR A, ;FIND OUT HOW MUCH FREE SPACE THERE IS
ERR 0,<TMPCOR of 0 to read available space fails. Find a wizard.>
CAIGE A,NTPCW ;SKIP IF THERE IS ENOUGH ROOM FOR US
JRST WTMPCE ;EXIT TO CALLER, WE CAN'T FIND ENUF SPACE
MOVE A,LUSER ;NOW PREPARE BLOCK FOR WRITING TEMP CORE FILLE
MOVEM A,TMPCBL
MOVS A,CURFIL ;NEXT WORD ← CURFIL,,DIPFIL (DISPLAY WINDOW ON WORLD)
HRR A,DIPFIL
MOVEM A,TMPCBL+1
MOVE A,[MMASK,,TMPCBL+2] ;PUT THE MASK WORDS OUT THERE
BLT A,TMPCBL+2+8
MOVEM F,TMPCBL+=11
MOVE A,LOSS0 ;THIS IS THE CURRENT DEVICE
MOVEM A,TMPCBL+=12
MOVE A,[ 3,,[ 'DRD',,
-NTPCW,,TMPCBL-1]
]
TMPCOR A, ;WELL, WRITE THIS HERE THING HERE
ERR 0,<Tempcore write fails.>
POP P,B ↔ POP P,A
POPJ P,
WTMPCE: POP P,B ↔ POP P,A
OUTSTR [ASCIZ /(tmpcor file not written for lack of space)/]
POPJ P,
RTMPC: PUSH P,A ↔ PUSH P,B
MOVE A,[ 2,,[ 'DRD',,
-NTPCW,,TMPCBL-1]
]
TMPCOR A, ;GET THAT FILE BACK (IF IT EXISTS)
JRST RTMPCE ;GO AWAY, ASSUME THE PROBLEM IS WE HAVE NO TEMPCORE FILE
TRO F,%TCORE ;MEANS WE FOUND A FILE. SO RANDOM THINGS WONT SET UP INTLS.
;NOW START PUTTING THIS TEMPCORE DATA INTO DIRED
MOVE A,TMPCBL
MOVEM A,LUSER ;THIS WAS THE OLD PPN
MOVE A,TMPCBL+1 ;CURFIL,,DIPFIL
HRRZM A,DIPFIL
HLRZM A,CURFIL
MOVE A,[TMPCBL+2,,MMASK] ;SET UP DAT MASK
BLT A,MMASK+8
MOVE A,TMPCBL+=11 ;THESE ARE THE OLD FLAGS
TRNE A,%SORT ;RESTORE ONLY THESE FLAGS
TRO F,%SORT
TRNE A,%FAST
JRST [ TRO F,%FAST
SETOM FULWHO ;WE ARE GOING INTO FAST MODE, PUT ALL THE FILES IN IT
SETZM ANYWHO ;INDICATE THERE ARE NO FULL MODE FILES
MOVE B,[FULWHO,,FULWHO+1]
BLT B,FULWHO+NFILES-1
JRST .+1 ;LEAVING THIS OUT CAUSES NICE OBSCURE BUG. (I KNOW)
]
TRNE A,%ORDER
TRO F,%ORDER
TRNE A,%DEBUG
TRO F,%DEBUG
TRNE A,%UDP
TRO F,%UDP
TRNE A,%KMODE
TRO F,%KMODE
TRNE A,%XTSRT
TRO F,%XTSRT
TRNE A,%SZSRTS
TRO F,%SZSRTS
MOVE A,TMPCBL+=12 ;THIS IS THE OLD DEVICE NAME
;THIS MESS STUFFS A IN ALL THE INIT DEVICE LOCATIONS
ZZZ←←0
FOR @! ZZ←0,9,1 < ;CLOBBER ALL THE LOSS!# 'S (NO .ISTOP! IN LOSING FAIL)
IFE ZZZ,< ;IF THE LAST GUY WE HACKED WAS DEFINED
IFDEF LOSS!ZZ,< ;AND THIS NEXT GUY EXISTS
MOVEM A,LOSS!ZZ ;SAVE THIS AWAY
> ;IFDEF THIS GUY
IFNDEF LOSS!ZZ,< ;HAVE WE HIT THE END OF THE LINE
ZZZ←←1 ;YEP, MAKE THE REST OF THIS FLY BY FASTER
> ;IFNDEF
> ;IFE ZZZ
> ;LOSING FOR
RTMPCE: POP P,B ↔ POP P,A
POPJ P,
TMPCBL: BLOCK NTPCW ;BLOCK FOR TEMP CORE OPERATIONS
COMMENT ⊗ To err is human, to forgive, Divine ⊗
FATL01: PUSHJ P,CLEAR
OUTSTR [ASCIZ /Fatal Error - GENTXT overshot DIRLIN at PUTL1
/]↔ SETZ↔EXIT
FATL02: PUSHJ P,CLEAR
TRNE F,%UDP ;DIRECT IN UDP MODE
OUTSTR [ASCIZ /You better check out the UDP. I can't INIT it./]
TRNN F,%UDP ;FOR DSK MODE
OUTSTR [ASCIZ /Can't INIT the /]
TTY6 3,LOSS0 ;TYPE THE DEVICE NAME WE ARE USING NOW
OUTSTR [ASCIZ /. Restart to try again./]
EXIT
FATL03: OUTSTR [ASCIZ /
PPN "/]
PUSHJ P,PRWHO
OUTSTR [ASCIZ /" Greedily Masticates.
Try Again: /]
MOVE P,[-PDS,,PDL-1]
INCHRS ;TAKE ALL THE CHRS OUT OF INPUT BUFFER, ASSUME TYPED BEFORE ERR MSG
JRST RPPN
JRST .-2
FALT04: PUSH P,A
OUTSTR [ASCIZ /
Non Fatal Bug - CURFIL overshot Screen. Report please.
/]↔ MOVEI A,
BEEP A,
POP P,A
JRST PUTREC
FATL05: OUTSTR [ASCIZ /
Non Fatal Error 105 - Right adjust fault. Please report. /]
JRST FAL05R
FATL06: PUSHJ P,CLEAR
OUTSTR [ASCIZ /
Fatal Error 69.105! Ran out of delete space. You ought to remember what
you were doing and report this./]
exit
FATL07: OUTSTR [ASCIZ /
Not a display??? You lose./]
exit
comment ⊗
FATL08: PUSHJ P,CLEAR
OUTSTR [ASCIZ /
You have a file named "←←←←←←". Please rename it.
/]
exit
⊗
FATL09: OUTSTR [ASCIZ /
LOOKUP FAILED IN FLOOKUP UUO. PROCEED WITH CAUTION!!/]
JRST UUORET
COMMENT ⊗ Help a luser ⊗
HELP: PUSH P,A ↔ PUSH P,B
MOVEI A,1 ;BLT 1'S TO DIRLIN
MOVEM A,DIRLIN
MOVE A,[DIRLIN,,DIRLIN+1]
BLT A,DIRLIN+DIRLEN-1
MOVE A,[440700,,DIRLIN] ;SET UP BP FOR UUOS
MOVEM A,BP7
TRNN F,%GETTY ;ONLY ON DD...
PUSHJ P,ZCLEAR ;CLEAN UP DIRECTORY STUFF LI'IN ABOUT
;DISPLAY THIS WHEN LUSER ASKS FOR IT, HELP ("?")
TRNN F,%DDELS ;USE DIFFERENT HELP FOR DELETE LIST MODE
SGENA [ASCIZ ≡
You are using Dired, a program that displays a directory of your
choosing, and permits you to modify it in various ways. Files may be deleted,
edited, or renamed (soon) using Dired.
In command descriptions below α and β are used to mean Control and Meta
respectively. Most commands take prefix arguments. Type arguments while
holding the Control and Meta keys. eg. αβ-αβ6αβ9 is an argument of -69.
These are the command for moving around in the display:
(Same as E commands)
CR Move down one line BS Move up one line
αβ< Move down 1/8th screen αβ> Move up 1/8th screen
αβ≤ Move down 1/2 screen αβ≥ Move up 1/2 screen
FORM Down to next screenful VT Up to next screenful
αβT Four more lines at top αβB Four more lines at bottom
αβJ Jump line to top αβ∧ and ∨ Cursor to top or bottom of window
Here are the rest of the commands with brief descriptions:
αβD Delete a file αβE Exit the Directory Editor
αβM Reads a file mask [ Reads a PPN
αβV Redraws the screen /HELP Displays switch documentation
/EDIT Enters E on the current file
/EXAMINE Enters E on the current file in /R mode.
- - - - - - - - - - - - - - - - - - - - - - - - - - - ¬
You may return to Dired from E by typing αXDRD<RETURN>
More information is available in DIRED.SGK[UP,DOC]
Type αβV to get back to your files
≡]
SGEN [ASCIZ ≡
You are in Delete List mode. Enter it and leave it with the /SHOW
command. The files shown here are ones which you have told Dired to
delete. Files can be removed from this list by using the αβD command
in th same way you used it to get them here.
In command descriptions below α and β are used to mean Control and Meta
respectively. Most commands take prefix arguments. Type arguments while
holding the Control and Meta keys. eg. αβ-αβ6αβ9 is an argument of -69.
These are the command for moving around in the display:
CR Move down one line BS Move up one line
αβ< Move down 1/8th screen αβ> Move up 1/8th screen
αβ≤ Move down 1/2 screen αβ≥ Move up 1/2 screen
FORM Down to next screenful VT Up to next screenful
Here are some other commands:
αβM Reads a file mask [ Reads a PPN
αβV Redraws the screen αβD Deletes entries from the delete list
/ Reads at least one switch (any number may be given)
/HELP Displays documentation on the switches
- - - - - - - - - - - - - - - - - - - - - - - - - - - ¬
Type αβD to delete an entry displayed here from the delete list
Type /SHOW<RETURN> to see your directory again
Type αβV to get back to the Delete List
≡]
HELDO: TRNE F,%GETTY
JRST HELIII ;III DON'T THINK DD CAN HACK IT PHYLS.
DDUPG [ 200000,,DDHEAD
DIRLEN+3
0
DDMUNG]
HELXIT: POP P,B ↔ POP P,A
JRST RIHANG
HELIII: AOS A,BP7 ;THIS GOT THE LOCATION WE WERE WRITING TEXT INTO LAST
SUBI A,IIHEAD ;NO NEED TO DISPLAY INF. NULS ON III (FLICKER FLICKER)
HRRZM A,IIIBLK+1 ;THIS IS WHERE LENGTH OF PRG KEPT
DPYOUT IIIBLK
PGACT (<SETZ>)
PGSEL
JRST HELXIT
HELPSW: PUSH P,A ↔ PUSH P,B
MOVEI A,1 ;BLT 1'S TO DIRLIN
MOVEM A,DIRLIN
MOVE A,[DIRLIN,,DIRLIN+1]
BLT A,DIRLIN+DIRLEN-1
MOVE A,[440700,,DIRLIN] ;SET UP BP FOR UUOS
MOVEM A,BP7
TRNN F,%GETTY ;ONLY ON DD...
PUSHJ P,ZCLEAR ;CLEAN UP DIRECTORY STUFF LI'IN ABOUT
;DISPLAY THIS WHEN LUSER ASKS FOR IT, HELP ("?")
SGEN [ASCIZ ≡
These are the switches currently available in Dired. Only enough of the
name of the switch to uniquely identify it need be typed. Type αβV to get
back to what you were looking at before. For more complete information see
DIRED.SGK[UP,DOC].
/ABORT Clears the delete list.
/ALPHA Dis plays the files sorted by file name.
/DATE Displays the files sorted by date last written.
/DELETE Runs the delete list.
/DSK MODE Changes your device to DSK:. Like typing αβM DSK:<CR>
/EDIT FILE Enters E on the current file. Re-enter Dired by typing αXDI<CR>
/EXAMINE Enters E on the current file in /R mode.
/EXTENSION Displays the files sorted by extension, then file name.
/F or FAST Puts you in fast mode. No lookups are done when reading UFD's.
/FULL MODE Removes you from /F mode. Displays dates, times, sizes, etc. of files.
/HELP Displays this cruft.
/LOOKUP Reads and displays full data for current file such as dates, size, etc.
/K MODE Complements the way file sizes greater than 1024 are printed.
/OUTPUT Writes all the directory information on the filename given.
/REVERSE Displays the files in reverse order. Sticky over other sort commands.
/SHOW Switches display modes between delete list mode and the normal mode.
/SIZE SORT Sorts the files by size.
/SPOOL Spools ARG files, starting with the current, on the LPT in /NOHEAD mode.
/UDP MODE Changes the device to UDP:.
≡]
TRNE F,%DDELS ;DIRECT IF IN DELETE LIST MODE
SGENA [ASCIZ /
Type αβV to get back to the Delete List
/]↔ SGEN [ASCIZ /
Type αβV to get back to your file display
/]
JRST HELDO
COMMENT ⊗ UUO Handler ⊗
UUOH: 0
MOVEM 17,UUOACS ;SAVE AC'S FOR UUOING
MOVEI 17,UUOACS
BLT 17,UUOACS+16
LDB A,[331100,,40] ;GET OP CODE OF UUO
CAILE A,LASUUO ;OP CODE OF LAST UUO
CJRST4: JRST 4,. ;UUO NOT DEFINED
JRST @UUODSP(A) ;GO TO IT
UUODSP: CJRST4 ;ZERO BITES
.GET ;GIVE WORD FROM UFD CHAN BACK TO USER
.SGEN ;STRING OUT TO BP7
.SPRINT ;PRINT NUMBER IN RADIX RADIX TO BP7
.FLOOK ;LOOKUP ON FILC, USE LUKDAT IF IT IS THERE, ADD IF NOT
.REMOVE ;FLUSH CORE DATA ON THIS FILE
.TYPE6 ;SEND AC ASCII CHRS TO BP7 FROM E (IN SIXBIT)
.TTY6 ;SAME AS ABOVE, TO TTY
.SGENA ;SGEN DAT SKIPS
LASUUO←←.-UUODSP-1
UUORET: MOVSI 17,UUOACS ;BLT AC'S BACK AND RETURN
BLT 17,17
JRST @UUOH
COMMENT ⊗ GET uuo ⊗
.GET: LDB A,[270400,,40] ;GET AC OF GET
CAIN A,UFDC
JRST .GET2
CAIN A,MFDC
JRST .GET3
ERR 0,<Ill. user uuo, GET to unimplemented chan.>
.GET3: SOSLE MFDNUL+2
JRST .GET4
INPUT MFDC,
STATO MFDC,20000
.GET4: AOS UUOH
ILDB A,MFDNUL+1
HRRZ B,40
CAIG B,17
MOVEM A,UUOACS(B)
MOVEM A,(B)
JRST UUORET
.GET2: SOSLE UFDNUL+2 ;DECREMENT BYTE POINTER IN HEADER
JRST .GET1 ;ITS OK
INPUT UFDC, ;DO AN INPUT
STATO UFDC,20000 ;DON'T SKIP RETURN IF YOU HAVE HIT THE END OF FILE
.GET1: AOS UUOH ;TO CAUSE SKIP RETURN
ILDB A,UFDNUL+1 ;YUM
HRRZ B,40 ;WHERE DOES HE WANT ME TO PUT THIS?
CAIG B,17 ;SKIP IF GOING TO MEMORY RATHER THAN AN AC
MOVEM A,UUOACS(B) ;STUFF IT IN AC
MOVEM A,(B) ;OR STUFF IT IN MEM.
JRST UUORET ;THAT IS IT
.TAKE: 0 ;JSR'D TO BY OTHER UUOS
AOS .TAKE ;ALWAYS SKIP RETURNS
MOVEM A,.TAKAS ;SAVE A
MOVE A,.TAKE ;NOW FIND OUT WHAT THE AC OF THE JSR IS
LDB A,[270400,,-1(A)]
CAIN A,A ;WAS THIS GUY USING THE AC WE CHOSE TO USE HERE?
SKIPA A,.TAKAS ;YEP, GET OLD STUFF BACK FOR OUTPUTING
MOVE A,(A) ;NO, SET UP A WITH CONT. OF AC HE GAVE US
SOSLE DELBLK+2
JRST .TAKE1
OUTPUT FIL, ;IT HAPPENS
.TAKE1: IDPB A,DELBLK+1 ;YUMMY. GOBBLE LUSERS DATA
MOVE A,.TAKAS ;GIVE HIM HIS OLD A BACK
JRST @.TAKE
.TAKAS: -1 ;HIDE A HERE WHILE DOIN THIS
COMMENT ⊗ SGEN uuo ⊗
.SGENA: AOS UUOH ;SKIP
.SGEN: SETZ B,
MOVE A,40 ;FOR THE ADDRESS OF INPUT TEXT
HRLI A,440700 ;MAKE A BYTE POINTER OUT OF IT
.SGEN0: ILDB B,A ;GET A CHARACTER FROM STRING CALLING US
JUMPE B,UUORET ;THAT'S IT FOR THIS STRING
TRNE F,%DEVUO ;DIRECT IF WE SHOULD OUTPUT TO FIL CHANEL
JSR B,.TAKE ; DO THAT AND SKIP OVER IDPB
IDPB B,BP7 ;DROP IT IN BP7
JRST .SGEN0
COMMENT ⊗ SPRINT uuo ⊗
.SPRIN: LDB C,[270400,,40] ;GET AC FIELD OF UUO
HRRZ A,40 ;GET E OF UUO
CAIGE A,20 ;SKIP IF E OF UUO IS MEMORY RATHER THAN AC
SKIPA A,UUOACS(A) ;LOAD FROM BLTED AWAY AC'S
MOVE A,(A) ;OF FROM MEMORY
PUSH P,[UUORET] ;CRANK OUT DIGITS
.SPR1: IDIV A,C ;C CONTAINS RADIX FROM AC FIELD OF UUO
HRLM B,(P)
SKIPE A
PUSHJ P,.SPR1
LDB B,[220600,,(P)]
TRCE B,=48
SETOM CCT
TRNE F,%DEVUO ;DIRECT IF WE SHOULD DO IO TO A DEVICE
JSR B,.TAKE ;DO THAT, AND SKIP OVER IDPB
IDPB B,BP7
AOS B,CCT
POPJ P,
CCT: -69
COMMENT ⊗ FLOOKUP uuo ⊗
.FLOOK: MOVEI A,UFDIN ;ADDRESS OF THE BLOCK
MOVE B,(A) ;GET THE FIRST FILE NAME HE WANTS
HLLZ C,1(A) ;GET THE EXT
MOVEI A, ;IDX INTO THE LUKDAT TAB
.FLL1: SETO D,
CAMN D,LUKDAT(A);IS THIS THE END OF TAB?
JRST .FL3 ;YES, WILL HAVE TO DO REAL LOOKUP
CAME B,LUKDAT(A);DOES THE FIRST FILE NAME MATCH
JRST .FL2 ;NO, TRY NEXT
HLLZ D,LUKDAT+1(A) ;GET THE EXT FROM LUKDAT
CAME C,D ;DOES THE EXT MATCH?
JRST .FL2 ;NO
MOVE D,UFDIN+3
CAMN D,LUKDAT+6(A) ;PPN MATCH?
JRST .FL4 ;YES, BLT HIM THE DATA
.FL2: ADDI A,7 ;NO, TRY NEXT ENTRY IN LUKDAT
JRST .FLL1
.FL4: HRLZ A,A ;BLT DATA IN LUKDAT(A) TO UFDIN
ADD A,[LUKDAT,,UFDIN]
BLT A,UFDIN+5 ;GIVE HIM THE BITS
AOS UUOH ;SKIP RETURN, HE WINS
JRST UUORET
.FL3: MOVE D,UFDIN+3 ;HOLD ONTO THE PPN, WE WILL NEED IT FOR PUTTING THIS LOOKUP IN LUKDAT
LOOKUP FILC,UFDIN
JRST .FLERR ;CAN'T LOOK IT UP, DO THE RIGHT THING IF IT WAS A PROTECT FAIL
AOS UUOH ;SKIP RETURN HE WINS
.FLL2B: MOVEI A, ;FIND THE FIRST FREE BLOCK IN LUKDAT
.FLL2: MOVE C,LUKDAT(A);GET THE FIRST WORD IN BLOCK IN LUKDAT
CAME C,[-1] ;IF IT IS -1 OR 0 IT IS EITHER THE END OF THE TABLE
CAIN C, ; (FREE CELL AT END) OR HOLE IN THE MIDDLE (REMOVED BEFORE)
JRST .FL5 ;FOUND A FREE CELL
ADDI A,7 ;ENTRIES IN LUKDAT ARE 7 LONG
JRST .FLL2 ;LOOP
.FL5: MOVE B,A ;FOR BLT
ADD B,[UFDIN,,LUKDAT]
BLT B,LUKDAT+5(A) ;PUT INFO IN LUKDAT FOR FUTURE REF.
MOVEM D,LUKDAT+6(A) ;PUT THIS PPN AWAY WITH THIS TOO
JRST UUORET
.FLERR: HRRZ A,UFDIN+1 ;SEE IF LOOKUP FAILED FOR PROTECTION REASONS
CAIE A,2 ;2 IS PROTECT
CAIN A, ;0 IS FILE NOT FOUND, IE IS BEING WRITTEN
JRST .FLER1
CAIE A,3 ;3 IS FILE IN USE, ALL OF THESE ARE 'OK ERRORS'
JRST FATL09
.FLER1: SETZM UFDIN+3 ;GUY MAY LOOK AT THIS WORD COUNT
JRST UUORET
COMMENT ⊗ REMOVE uuo ⊗
.REMOV: HRRZ A,40 ;GET E OF UUO
CAIL A,20 ;SKIP IF IT IS AN AC
SKIPA A,(A) ;GET FROM MEMORY
MOVE A,UUOACS(A);GET FROM SAVED USER ACS
MOVE B,FILES(A) ;GET IDX INTO UFD
MOVE C,UFD(B) ;GET FIRST FILE NAME WE ARE TO REMOVE
MOVE D,UFD2(B) ;GET EXT, NOW LOOK FOR IT IN LUKDAT TABLE
MOVE I,LLUSER(B)
LDB E,[270400,,40] ;GET AC F. OF UUO
CAIN E,1 ;AC OF ONE MEANS DONT ACTUALLY MUNCH LUKDAT
JRST .REMO3
MOVEI E,NFILES
MOVEI B, ;WE USE B FOR IDX INTO LUKDAT
.REMO1: SOJL E,.REMOE ;NEVER GET THERE, MEANS WE COULD NOT FIND THIS FILE IN LUKDAT
CAMN C,LUKDAT(B); DIRECT IF FIRST FILE NAME MATCHES FOR THIS ENTRY
CAME D,LUKDAT+1(B) ; SKIP IF EXT MATCHES
JRST .REMO4
CAMN I,LUKDAT+6(B) ;DIRECT IF WE HAVE A WINNER, EVERYTHING MATCHES
JRST .REMO2 ;GOT IT IN E
.REMO4: ADDI B,7 ;TRY NEXT LUKDAT ENTRY
JRST .REMO1
.REMO2: SETZM LUKDAT(B) ;ZERO IN 1ST WD OF BLOK IN LUKDAT MARKS FREE BLOK
MOVS B,LUKDAT+3(B) ;4TH WORD OF LUKUP BLOK HAS -SWPD WORD COUNT
ADDM B,WORDS ;SO MAKE IT LOOK LIKE WE HAVE REALLY DELETED THIS
; FILE TO HIS WORD COUNT.
.REMO3: ADDI A,FILES
HRLI A,1(A) ;A HAS 'FILES' IDX, MAKE BLT AC OUT OF IT TO REMOVE
BLT A,FILES+NFILES-1 ; THIS FILE FROM DISPLAY LIST
JRST UUORET
.REMOE: ERR 0,<Fatal Error in REMOVE uuo. Files specifed is not in LUKDAT table.>
COMMENT ⊗ TYPE6 uuo ⊗
.TYPE6: LDB A,[270400,,40] ;GET AC OF UUO (RPT COUNT ON OUTPUTING CHRS)
HRRZ B,40 ;USE E OF UUO FOR GETTING CHRS
CAIGE B,20 ;DIRECT IFF CHRS ARE COMMING FROM USER ACS
ADDI B,UUOACS ; CAUSE IT TO POINT AT SAVED USER ACS
HRLI B,440600 ;MAKE A SIXBIT BYTE POINTER OUT OF E OF UO
TYPE61: SOJL A,UUORET ;OUTPUT AC CHRS BY...
ILDB C,B ;GET A SIXBIT CHR
ADDI C,40 ;MAKE ASCII OUT OF IT
TRNE F,%DEVUO ; 1==> OUTPUT TO A DEVICE ON FIL CHAN.
JSR C,.TAKE ;WILL SKIP RETURN
IDPB C,BP7 ;STUFF IT AWAY IN BP7
JRST TYPE61
COMMENT ⊗ TTY6 uuo ⊗
.TTY6: LDB A,[270400,,40] ;GET AC OF UUO (RPT COUNT ON OUTPUTING CHRS)
HRRZ B,40 ;USE E OF UUO FOR GETTING CHRS
CAIGE B,20 ;DIRECT IFF CHRS ARE COMMING FROM USER ACS
ADDI B,UUOACS ; CAUSE IT TO POINT AT SAVED USER ACS
HRLI B,440600 ;MAKE A SIXBIT BYTE POINTER OUT OF E OF UO
.TTY61: SOJL A,UUORET ;OUTPUT AC CHRS BY...
ILDB C,B ;GET A SIXBIT CHR
ADDI C,40 ;MAKE ASCII OUT OF IT
OUTCHR C ;STUFF IT AWAY IN BP7
JRST .TTY61
COMMENT ⊗ Usage lossage ⊗
USTATS: GETPPN A, ;DON'T BOTHER WITH THIS STUFF FR ME, I KNOW ABOUT IT
CAMN A,['105SGK']
POPJ P,
INIT UFDC, ;USE UFD CHAN FOR INPUT
SIXBIT /DSK/
UFDNUL
JRST USTATE ;GIVE UP IF WE CAN'T INIT
INIT FIL,
SIXBIT /DSK/
DELBLK,,
JRST USTATE
MOVE A,[['DIRED '↔'USE '↔0↔'105SGK'],,USTFOO]
BLT A,USTFOO+3
LOOKUP UFDC,USTFOO
JRST USTATE
MOVE A,[['DIRED '↔'USE '↔0↔'105SGK'],,USTFOO]
BLT A,USTFOO+3
ENTER FIL,USTFOO
JRST USTATE
TRO F,%DEVUO
USTA1: PUSHJ P,.USI
CAIN A,"β"
JRST USTA2
PUSHJ P,.USO
JRST USTA1
USTA2: TRNN F,%START ;DIRECT RETURN IF THIS IS THE FIRST TIME HERE
SGENA [ASCIZ /*/];INDICATE HERE IS WHERE THE GUY STARTED DIRED
SGEN [ASCIZ / /] ;INDICATE WE GOT HERE BECAUSE OF A αβM OR [ TO DIRED
GETPPN A,
TYPE6 6,A
SGEN [ASCIZ / /]
SGEN [ASCIZ *[*]
TYPE6 6,LUSER
SGEN [ASCIZ /] /]
TRNE F,%TTY ;ON A PRINTING TTY? ;PRINT <TTY TYPE><LINE NUMBER>
JRST [SGEN [ASCIZ /TTY/] ;DEVICE NAME
JRST USTTYT] ;IGNORE %GETTY BIT
TRNE F,%GETTY ;DIRECT ON III
SGENA [ASCIZ /III/]
SGEN [ASCIZ / DD/]
USTTYT: GETLN A, ;THIS GIVES THE SIXBIT OF THE TTY WE ARE ON
MOVS A,A ;GET THE 3 CHRS ON LINE NUMBER IN LEFT HALS
TYPE6 3,A ;CRANK THEM OUT
SGEN [ASCIZ / /]
DATE A,
IDIVI A,=31
ADDI B,1 ;REMAINDER IS DAY-1
CAIGE B,=10 ;IF LESS THAN 10 TYPE A SPACE TO FORCE IT TO TAKE 2 POS.
SGEN [ASCIZ / /];LIKE I SAID, NUMBER ONE DIGIT, TAKE 2 POSITIONS
SPRINT =10,B ;CRANK DAY OUT
IDIVI A,=12
XCT MONTHS(B) ;UUO WILL PRINT NAME OF MONTH
ADDI A,=64 ;OR 1964 FOR FULL YEAR NUMBER,,,,
SPRINT =10,A ;GUESS
SGEN [ASCIZ/ /];BLOOD IS THICKER THAN PRUNE JUICE
TIMER A,
IDIVI A,=3600
IDIVI A,=60
MOVEM B,.USTT#
IDIVI A,=10
SPRINT 12,A
SPRINT 12,B
MOVE A,.USTT
IDIVI A,=10
SPRINT 12,A
SPRINT 12,B
SGEN [ASCIZ / /] ;TAB FOR TYPE OF DEVICE
USTT1: SGEN [ASCIZ / /] ;TAB FOR BEGINING OF SWITCHES
TRNE F,%ORDER ;DIRECT FOR REVERSE SORT
SGEN [ASCIZ */REV*]
TRNE F,%SZSRTS ;SKIP IF SIZE SORT OUT OF RUNNING, LOOK AT %SORT & %XTSRT
JRST [ SGEN [ASCIZ */SIZE*]
JRST USTTSR] ;DONT CONSIDER ANY OTHER SORT SWITCHES
TRNN F,%SORT ;SKIP IF SORT BY DATE
JRST [ TRNE F,%XTSRT ;MAY BE ALPHA SORT OR EXT SORT
SGENA [ASCIZ */EXT*]
SGEN [ASCIZ */ALPHA*]
JRST USTTSR] ;SKIP OVER SGEN FOR DATE SWITCH
SGEN [ASCIZ */DATE*] ;HE IS DATE SORTING
USTTSR: TRNE F,%FAST ;DIRECT IF IN FAST MODE
SGENA [ASCIZ */FAST*]
SGEN [ASCIZ */FULL*]
SPRINT 8,[-36]
TRZ F,%DEVUO
USTATE: CLOSE UFDC,
CLOSE FIL,
POPJ P,
.USI: SOSLE UFDNUL+2
JRST .USI1
INPUT UFDC,
STATZ UFDC,20000
SKIPA A,["β"]
.USI1: ILDB A,UFDNUL+1
CAIN A, ;DONT GIVE THE USER 0
JRST .USI
POPJ P,
.USO: SOSLE DELBLK+2
JRST .USO1
OUTPUT FIL,
.USO1: IDPB A,DELBLK+1
POPJ P,
USTFOO: BLOCK 4
END GO